hi,大家好,在我们工作中,经常用到继承,但python的继承有两种,一种是直接调用父类名.__init__(self),另外一种是super().__init__()。
首先,我们来看第一种,直接上代码
class Animal(object):
def __init__(self, name):
print("Animal的init开始被调用")
self.name = name
print("Animal的init的调用结束")
class Lion(Animal):
def __init__(self, name, age):
print("Lion的init开始被调用")
self.age = age
Animal.__init__(self, name)
print("Lion的init的调用结束")
class Tiger(Animal):
def __init__(self, name, gender):
print("Tiger的init开始被调用")
self.gender = gender
Animal.__init__(self, name)
print("Tiger的init的调用结束")
class Liger(Lion, Tiger):
def __init__(self, name, age, gender):
print("Liger的init开始被调用")
Lion.__init__(self, name, age)
Tiger.__init__(self, name, gender)
print("Liger的init的调用结束")
liger = Liger('luna', 6, '女')
Liger的init开始被调用
Lion的init开始被调用
Animal的init开始被调用
Animal的init的调用结束
Lion的init的调用结束
Tiger的init开始被调用
Animal的init开始被调用
Animal的init的调用结束
Tiger的init的调用结束
Liger的init的调用结束
从打印的结果可以看出,当使用 父类名.__init__(self)时,我们实例化对象时候,会掉用两次Animal(),这是因为当调用Liger()时,会分别继承Lion(),Tiger(),而这两个都会继承Animal(),所以最终结果是调用两次Animal()。
第二种,super().__init__()。
class Animal(object):
def __init__(self, name, *args, **kwargs):
print("Animal的init开始被调用")
self.name = name
print("Animal的init的调用结束")
class Lion(Animal):
def __init__(self, name, age, *args, **kwargs):
print("Lion的init开始被调用")
self.age = age
super().__init__(name, *args, **kwargs)
print("Lion的init的调用结束")
class Tiger(Animal):
def __init__(self, name, gender, *args, **kwargs):
print("Tiger的init开始被调用")
self.gender = gender
super().__init__(name, *args, **kwargs)
print("Tiger的init的调用结束")
class Liger(Lion, Tiger):
def __init__(self, name, age, gender):
print("Liger的init开始被调用")
super().__init__(self, name, age, gender)
print("Liger的init的调用结束")
print(Lion.__mro__)
liger = Liger('luna', 6, '女')
(<class '__main__.Lion'>, <class '__main__.Animal'>, <class 'object'>)
Liger的init开始被调用
Lion的init开始被调用
Tiger的init开始被调用
Animal的init开始被调用
Animal的init的调用结束
Tiger的init的调用结束
Lion的init的调用结束
Liger的init的调用结束
从打印的结果中我们可以看出,使用super().__init__()时,Animal只会调用一次,其原因是,python解释器里有C3算法,可以重新规划super()调用父类的顺序,可以根据类名.__mro__查看调用顺序。