Python学习笔记——类的继承

总结一下再次学习类的继承这一块,关于继承的几种写法。

考虑如下代码:

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势必会造成资源的浪费。

猜你喜欢

转载自blog.csdn.net/leavemetomorrow/article/details/88799481