类的继承


# 类的继承

Python 支持多父类的继承机制,所以需要注意圆括号中基类的顺序,若是基类中有相同的方法名,并且在子类使用时未指定,Python 会从左至右搜索基类中是否包含该方法。一旦查找到则直接调用,后面不再继续查找。

# 继承机制

Python3 的继承机制不同于 Python2。其核心原则是下面两条:

  • 子类在调用某个方法或变量的时候,首先在自己内部查找,如果没有找到,则开始根据继承机制在父类里查找。
  • 根据父类定义中的顺序,以深度优先的方式逐一查找父类。

# 第一个例子

设想有下面的继承关系:

class A(B, E):
    pass
1
2
  • A 继承 B 和 E
    • B 继承 C,C 继承 D
    • E 继承 F,F 继承 G

如下图所示:

ABECFDG

(继承关系 - 第一个例子)

在这种继承结构关系中,子类在调用某个方法或变量的时候,搜索顺序是这样的(按下图中红色箭头路径指向):

ABECFDG123456

(第一个例子的搜索顺序)

# 第二个例子

如果继承结构是这样的:类 D 和类 G 又同时继承了类 H,如下图所示:

ABECFDGH

(继承关系 - 第二个例子)

此时的搜索顺序是这样的(按下图中红色箭头路径指向):

ABECFDG123456H7

(第二个例子的搜索顺序)

至于其它更错综复杂的继承情况,其实都能划分成上面两种情况。

# super() 函数

在子类中如果有与父类同名的成员,那就会覆盖(Override)掉父类里的成员。

此时如果想强制调用父类的成员,可以使用 super() 函数。这是一个非常重要的函数,最常见的就是通过 super 调用父类的实例化方法 __init__

语法:super(子类名, self).方法名(),需要传入的是子类名和 self,调用的是父类里的方法,按父类的方法需要传入参数。如下例所示:

class A:
    def __init__(self, name):
        self.name = name
        print("父类的__init__方法被执行了!")
    def show(self):
        print("父类的show方法被执行了!")

class B(A):
    def __init__(self, name, age):
        super(B, self).__init__(name=name)
        self.age = age

    def show(self):
        super(B, self).show()

obj = B("zhangsan", 13)
obj.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

(完)