语法角度讲
继承方法
代码:
class Parent:
def p_fun(self):
print("父类方法")
class Child(Parent):
def c_fun(self):
print("子类方法")
c = Child()
c.c_fun()
c.p_fun()
说明:子类直接拥有父类的方法.
内置函数
isinstance(对象, 类型)
返回指定对象是否是某个类的对象。
issubclass(类型,类型)
返回指定类型是否属于某个类型。
print(isinstance(c, Child)) # True
print(isinstance(p, Parent)) # True
print(issubclass(Child, Parent)) # True
继承数据
代码:
class Parent:
def __init__(self, color="red"):
self.color = color
class Child(Parent):
def __init__(self, weight):
super().__init__()
self.weight = weight
c = Child(50)
p = Parent()
print(c.__dict__) # {'color': 'red', 'weight': 50}
说明:子类如果没有构造函数,将自动执行父类的,但如果有构造函数将覆盖父类的。此时必须通过super()函数调用父类的构造函数,以确保父类实例变量被正常创建。
定义
重用现有类的功能,并在此基础上进行扩展。
说明:子类直接具有父类的成员(共性),还可以扩展新功能。
优点
一种代码复用的方式。
缺点
耦合度高:父类的变化,直接影响子类。
设计角度讲
定义
将相关类的共性进行抽象,统一概念,隔离变化。
适用性
多个类在概念上是一致的,且需要进行统一的处理。
相关概念
父类(基类、超类)、子类(派生类)。
父类相对于子类更抽象,范围更宽泛;子类相对于父类更具体,范围更狭小。
单继承:父类只有一个(例如 Java,C#)。
多继承:父类有多个(例如C++,Python)。
Object类:任何类都直接或间接继承自 object 类。
多继承
一个子类继承两个或两个以上的基类,父类中的属性和方法同时被子类继承下来。
同名方法的解析顺序(MRO, Method Resolution Order):
类自身 --> 父类继承列表(由左至右)--> 再上层父类
A
/ \
/ \
B C
\ /
\ /
D
示例:
class Parent:
def __init__(self, color="red"):
self.color = color
def p_fun(self):
print("父类方法")
class Child(Parent):
def __init__(self, weight):
super().__init__()
self.weight = weight
def c_fun(self):
print("子类方法")
p = Parent()
c = Child(50)
c.c_fun() # 子类方法
c.p_fun() # 父类方法
print(c.__dict__) # {'color': 'red', 'weight': 50}
print(p.__dict__) # {'color': 'red'}