继承 的逻辑,还是蛮容易理解的。我们构建了一个 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)
的写法,因为,它没有新增概念,且是自然的逻辑。