class NamedAnimal:
def __init__(self, name):
self.name = name
def __str__(self):
return "{} {}".format(type(self).__name__, self.name)
def __repr__(self):
return "{}('{}')".format(type(self).__name__, self.name)
class Dog(NamedAnimal):
def __init__(self, name, age):
# step 1: manually call parent init
NamedAnimal.__init__(self, name)
# step 2: do our own additional init
self.age = age
def speak(self):
print("bark")
class Cat(NamedAnimal):
def speak(self):
print("bark")
def __str__(self):
return NamedAnimal.__str__(self) + ", string expert"
c = Cat("Kevin")
print(c)
d = Dog("Sam", 1)
print(d)
输出
Cat Kevin, string expert
Dog Sam
从上面可以看出:
-
如果子类没有定义自己的初始化函数,那么在构建子类对象时父类的初始化函数会被默认调用,但是在这种情况下,子类的定义参数必须与父类一致,否则会出错。
比如在定义cat时,如果是c = Cat(“Kevin”, 1),则报错:
TypeError: init() takes 2 positional arguments but 3 were given -
如果子类定义了自己的初始化函数,则不会自动调用父类的初始化函数,必须要手动传参调用。如果初始化了父类,那么父类和子类的属性都可以被使用。
比如把Dog中NamedAnimal.init(self, name) 这一句注释掉,再print(d)时会报错:
AttributeError: ‘Dog’ object has no attribute ‘name’
本文深入探讨Python中类的继承机制,特别是初始化过程。详细解释了当子类没有定义初始化函数时,父类初始化函数的默认调用行为,以及子类如何手动调用父类的初始化函数来确保正确初始化所有属性。
462

被折叠的 条评论
为什么被折叠?



