继承

继承 的逻辑,还是蛮容易理解的。我们构建了一个 Class,它以另外一个 Class 为 (也叫父Class),那么就存在继承关系了,所有 上的方法、属性,都会存在于当前 Class 中。
一般没有父Class的 Class,也是以 object 这个通用对象 Class 为源的。
一个子Class父Class承之后,如果定义了父Class上也有的某个函数,那么,肯定以当前的 子Class 为优先的。我们可以把 父Class 当做纯粹的模板,继承之后,其实跟父Class就没有关系了。

我们来看代码吧:

class Parent(object):
    def hello(self):
        print('hello from parent')

    def world(self):
        print('world from parent')


class Child(Parent):
    # 与 父Class 上同名的函数,以当前为准
    def world(self):
        Parent.world(self)
        print('world from child')
    
    # 这个 method 在 父Class 上没有
    def method_not_on_parent(self):
        print('only works for child')

我们将 Child 实例化,然后调用 hello 这个函数,虽然在 Child 未定义过,但是已经从 Parent 中继承过来了。然后,再调用 world 这个函数,它在 Parent 和 Child 中都有定义。
我们来看实际的代码运行结果:

>>> child = Child()
>>> child.hello()
hello from parent
>>> 
>>> child.world()
world from parent
world from child

child.world() 运行的过程中,同时也 print 了 world from parent,是因为 Child.word 上的这行代码 Parent.world(self) 起作用,它表示从 Child 内调用 Parent 的方法。你可以删除这行代码,再看看效果如何。
很多时候,我们继承并构建了新的 Class,重写了某个函数,并非完全替代父Class上的源函数,可能只是一种扩充,那么,重新调用 父Class 上的源函数,是常见的方式。
除了 Parent.world(self) 的写法,也可以写成 super(Child, self).world(),Python 3 中则可以直接写成 super().world(),Python 3 的语法更容易理解。
但我个人而言,更喜欢 Parent.world(self) 的写法,因为,它没有新增概念,且是自然的逻辑。