先接着说说昨天的遗留问题吧:
继承时的构造函数,可以super(Test, self).__init__()
去调用,也可以object.__init__(self)
调用,那这两种方法有什么区别呢?
昨天说了,单继承时,这两个方法是一样的功能,在看看多继承时:
class Base(object):
def __init__(self):
print("base_init")
class A(Base):
def __init__(self):
print('start_A')
# Base.__init__(self)
super(A, self).__init__()
print('finish_A')
class B(Base):
def __init__(self):
print('start_B')
# Base.__init__(self)
super(B, self).__init__()
print('finish_B')
class C(A,B):
pass
c = C();
下面是输出:
start_A
start_B
base_init
finish_B
finish_A
- 多个父类有共同的父类:比如C,多继承与A、B,A、B又是有共同的父类Base,那么,
super(A, self).__init__()
会调用B.__init__(self)
方法,而super(B, self).__init__()
会调用Base.__init__(self)
的方法。
此时,直接调用A.__init__()
则不会去调用到B.__init__(self)
的方法,这是区别。
class Base(object):
def __init__(self):
print("base_init")
class A(Base):
def __init__(self):
print('start_A')
# Base.__init__(self)
super(A, self).__init__()
print('finish_A')
class B(object):
def __init__(self):
print('start_B')
# Base.__init__(self)
super(B, self).__init__()
print('finish_B')
class C(A,B):
pass
c = C();
输出:
start_A
base_init
finish_A
- 多个父类没有共同的父类:此时这两个方法的作用跟单继承没两样。
这样当一个类多继承,并且父类都还是继承同一个基类时,就不用在子类挨个调一遍父类的构造方法了,省去了很多的代码。
这个问题就告一段落了。
多继承父类方法重名
下面来看看多个继承时父类方法重名的问题。先看看例子
class Base(object):
def function():
print('function_Base')
class A(Base):
def function(self):
print('function_A')
class B(Base):
def function(self):
print('function_B')
class C(A,B):
pass
c = C();
c.function()
输出结果:
function_A
可见多个父类方法重名时,默认只调用第一个继承对象的方法,不调用第二个父类的的方法。
好了,今天先学习这么多,明儿见。