总结一下再次学习类的继承这一块,关于继承的几种写法。
考虑如下代码:
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
class Teacher(Person):
def __init__(self, name, gender, course):
#super(Teacher,self).__init__(name, gender)
#Person.__init__(self, name, gender)
#super().__init__(name, gender)
self.course = course
t = Teacher('Alice', 'Female', 'English')
print(t.name)
print(t.course)
注释的3种写法,效果完全一样,但最后一种是3.x环境下才可以运行的。
几种写法,需要注意有没有self。
但是,上面的例子是单类继承。
再考虑下面的例子。(鉴于写法1和3只是省略了参数,看作是一个写法,下面只讨论写法1和2)
class A(object):
def __init__(self, a):
print 'init A...'
self.a = a
class B(A):
def __init__(self, a):
super(B, self).__init__(a)
print 'init B...'
class C(A):
def __init__(self, a):
super(C, self).__init__(a)
print 'init C...'
class D(B, C):
def __init__(self, a):
super(D, self).__init__(a)
print 'init D...'
按照最老套的写法,返回结果为
init A...
init C...
init B...
init D...
如果改成如下写法,
class A(object):
def __init__(self, a):
print('init A...')
self.a = a
class B(A):
def __init__(self, a):
A.__init__(self,a)
print('init B...')
class C(A):
def __init__(self, a):
A.__init__(self,a)
print('init C...')
class D(B, C):
def __init__(self, a):
B.__init__(self,a)
C.__init__(self,a)
print('init D...')
d = D('what')
则结果为
init A...
init B...
init A...
init C...
init D...
我个人来说,如果是正统的继承树的形式,用写法2好理解,如果有出现多态继承,那写法2势必会造成资源的浪费。