Python 类的继承
继承指一个类可以基于另一个类扩展或复用其属性与方法:子类自动获得父类的行为,并可在不破坏父类的前提下增加或改写功能,从而提高复用性与可维护性。
若类 Y 继承自类 X,则 Y 的实例在方法解析规则下可使用 X 中定义的成员(具体可见 isinstance / issubclass、MRO 等,进阶见 多重继承)。
常用术语
| 术语 | 含义 |
|---|---|
| 父类 / 基类 / 超类 | 被继承的类 |
| 子类 / 派生类 | 继承其它类的类 |
语法
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, ...)。
isinstance 与 issubclass
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、钻石问题等见 多重继承。