由于存在继承机制。所以子类可以继承父类的所有属性和方法。但是在有些情况下子类从父类继承的方法中,大部分是适合子类使用的。 但是有一部分方法不能直接照搬父类的。如果不对这些方法修改。那么子类是无法使用的。 所以需要在子类中重复父类的方法。
对于所有的母鸡来说都可以行走。 而且都有翅膀。而且可以下蛋。
class Hen:
def LayAEegg(self):
print("我会下蛋")
def wing(self):
print("我有翅膀")
def fly(self):
print("我会飞")
对于公鸡来说它并不会下蛋。 所以在继承母鸡方法的同时还要对下蛋这个方法进行修改
class Hen:
def LayAEegg(self):
print("我会下蛋")
def wing(self):
print("我有翅膀")
def fly(self):
print("我会飞")
class Cock(Hen):
def fly(self):
print("我不会下蛋")
class Hen:
def LayAEegg(self):
print("我会下蛋")
def wing(self):
print("我有翅膀")
def fly(self):
print("我会飞")
class Cock(Hen):
def fly(self):
print("我不会下蛋")
a = Cock()
a.fly()
我不会下蛋
class Hen:
def LayAEegg(self):
print("我会下蛋")
def wing(self):
print("我有翅膀")
def fly(self):
print("我会飞")
class Cock(Hen):
def fly(self):
print("我不会下蛋")
a = Cock()
Hen.fly(a)
我会飞
既然子类可以继承父类所有的属性和方法。那么父类的构造函数也不例外,除此之外python的多继承的语言。如果一个子类同时继承了多个父类的同名的类实例方法。则子类对象中调用该方法时。则会优先选择排在前面的父类中的实例方法。 构造方法也遵循这样的原则。
class Person:
def __init__(self, name):
self.name = name
def getName(self):
print(self.name)
class Person1:
def __init__(self, age):
self.age = age
def getAge(self):
print(self.age)
class Person2(Person, Person1):
pass
a =Person2("小王")
a.getName()
a.getAge()
小王
Traceback (most recent call last):
File "/Users/apple/Documents/重要文件/python3/python21.py", line 23, in
a.getAge()
File "/Users/apple/Documents/重要文件/python3/python21.py", line 14, in getAge
print(self.age)
AttributeError: 'Person2' object has no attribute 'age'
鉴于这种情况正确的做法是,定义子类中自己的构造方法。但是值得注意的是。在子类中定义构造方法。则必须在该方法中调用父类的构造方法。分为两种情况,
class Person:
def __init__(self, name):
self.name = name
def getName(self):
print(self.name)
class Person1:
def __init__(self, age):
self.age = age
def getAge(self):
print(self.age)
class Person2(Person, Person1):
def __init__(self, name, age):
# 通过super()调用
super().__init__(name)
# 通过普通函数的方式调用 注意需要手动绑定参数
Person1.__init__(self, age)
a = Person2("小王", 30)
a.getName()
a.getAge()
小王
30