Skip to content

Python 类的继承

继承指一个类可以基于另一个类扩展或复用其属性与方法:子类自动获得父类的行为,并可在不破坏父类的前提下增加或改写功能,从而提高复用性可维护性

若类 Y 继承自类 X,则 Y 的实例在方法解析规则下可使用 X 中定义的成员(具体可见 isinstance / issubclassMRO 等,进阶见 多重继承)。

相关基础:类与对象类构造函数self 变量

常用术语

术语含义
父类 / 基类 / 超类被继承的类
子类 / 派生类继承其它类的类

语法

python
class 父类名:
    # 父类体


class 子类名(父类名):
    # 子类体

子类写在括号里的即为直接父类;Python 3 中类默认继承 object,可省略不写。

示例:基类

python
class Father:
    def __init__(self, name, lastname):
        self.name = name
        self.lastname = lastname

    def printname(self):
        print(self.name, self.lastname)


x = Father("Anees", "Mulani")
x.printname()

输出:

text
Anees Mulani

示例:子类与父类 __init__

子类若重新定义 __init__,通常需要调用父类__init__,以完成父类侧的初始化。

写法一:父类.__init__(self, ...)

python
class Son(Father):
    def __init__(self, name, lastname):
        Father.__init__(self, name, lastname)


x = Son("Dev", "Bajaj")
x.printname()

输出:

text
Dev Bajaj

写法二:super().__init__(...)

super()方法解析顺序(MRO) 找到父类,不必硬编码父类名;单继承下与上面等价,多继承时行为由 MRO 决定。

python
class Father:
    def __init__(self, name, lastname):
        self.name = name
        self.lastname = lastname

    def printname(self):
        print(self.name, self.lastname)


class Son(Father):
    def __init__(self, name, lastname):
        super().__init__(name, lastname)


x = Son("Dev", "Bajaj")
x.printname()

输出:

text
Dev Bajaj

原文示例中误写为 Student,已改为 Son,与类定义一致。

方法重写

子类中定义与父类同名的方法会覆盖父类实现;需要复用父类逻辑时,可在子类方法内调用 super().方法名(...)父类.方法名(self, ...)

isinstanceissubclass

python
class Animal:
    pass


class Dog(Animal):
    pass


d = Dog()
print(isinstance(d, Dog))    # True
print(isinstance(d, Animal)) # True
print(issubclass(Dog, Animal))  # True

小结

  • 子类 class Child(Parent): 继承 Parent 的成员,并可扩展或重写。
  • 子类 __init__ 中常调用 super().__init__(...)Parent.__init__(self, ...)
  • 多继承、MRO、钻石问题等见 多重继承

参考