Inheritance

继承

例子

继承说简单点就是一个类可以继承另一个类的方法和属性

class Father:
    def __init__(self):
        self.Fname = 'Da'

    def func(self):
        print('father.func')

    def bad(self):
        print('father.bad')

# 子类/派生类
class Son(Father):
    def __init__(self):
        self.Sname = 'Yo'

    def bar(self):
        print('son.bar')


s = Son()
s.func()

输出

father.func

当然子类也可以覆盖(重写)父类

class Father:
    def __init__(self):
        self.Fname = 'Da'

    def func(self):
        print('father.func')

    def bad(self):
        print('father.bad')

# 子类/派生类
class Son(Father):
    def __init__(self):
        self.Sname = 'Yo'

    def bar(self):
        print('son.bar')

    def bad(self):
        print('Son so bad than father')

s = Son()
s.bad()

输出

Son so bad than father

经典类

class Father:
    def __init__(self):
        self.Fname = 'Da'
        print('Father init.')

    def func(self):
        print('father.func')

    def bad(self):
        print('father.bad')

# 子类/派生类
class Son(Father):
    def __init__(self):
        print('Son init.')
        Father.__init__(self)
        self.Sname = 'Yo'

    def bar(self):
        print('son.bar')

    def bad(self):
        print('Son so bad than father')

s = Son()

新式类

# 父类/基类
class Father(object):
    def __init__(self):
        self.Fname = 'Da'
        print('Father init.')

    def func(self):
        print('father.func')

    def bad(self):
        print('father.bad')

# 子类/派生类
class Son(Father):
    def __init__(self):
        print('Son init.')
        super(Son, self).__init__()
        self.Sname = 'Yo'

    def bar(self):
        print('son.bar')

    def bad(self):
        print('Son so bad than father')

s = Son()

输出

Son init.
Father init.

多继承(MRO)

新式类和经典类,在多继承的情况下,他们的继承顺序会有点不一样

经典类

class A:
    def __init__(self):
        print('A')
    def save(self):
        print('save method from A.')

class B(A):
    def __init__(self):
        print('B')

class C(A):
    def __init__(self):
        print('C')
    def save(self):
        print('save method from C.')

class D(B, C):
    def __init__(self):
        print(D)

t = D()
t.save()

输出

__main__.D
save method from A.

新式类

class A(object):
    def __init__(self):
        print('A')
    def save(self):
        print('save method from A.')

class B(A):
    def __init__(self):
        print('B')

class C(A):
    def __init__(self):
        print('C')
    def save(self):
        print('save method from C.')

class D(B, C):
    def __init__(self):
        print(D)

t = D()
t.save()

输出

<class '__main__.D'>
save method from C.

从输出结果可以看到,新式类和经典类他们继承到的方法是不同的,经典类继承到了基类的方法,而新式类则继承到了最近一级父类的方法,查阅一番资料后得知

  • 经典类使用的是深度优先算法
  • 新式类使用的是广度优先算法

经典类查找顺序是:B->A->C 新式类查找顺序是:B->C->A

所以两者最红获取到的方法是不同的,3.x测试了下,默认就是使用广度优先

错了,错了,Python3的MRO算法不是广度优先,而是C3算法

results matching ""

    No results matching ""