派生
【一】概要
- "派生"(Derivation)是指在面向对象编程中,通过创建新的类,基于已有的类(通常称为父类或基类)来构建新的类,以获取和扩展父类的属性和方法。在这个过程中,新创建的类称为子类或派生类。
- 通俗来讲,派生是指,子类继承父类,派生出自己的属性与方法,并且重用父类的属性与方法
【二】常用方法
【1】指名道姓
| class 父类(): |
| def __init__(self,参数1,参数2): |
| self.参数1 = 参数1 |
| self.参数2 = 参数2 |
| |
| class 派生类(父类): |
| '''此处派生是为了,继承父类的初始化属性,并初始化自己的属性''' |
| def __init__(self,参数1,参数2,派生类自己的参数): |
| |
| 父类.__init__(self,参数1,参数2) |
| |
【2】super()
| class 父类(): |
| def __init__(self,参数1,参数2): |
| self.参数1 = 参数1 |
| self.参数2 = 参数2 |
| |
| class 派生类(父类): |
| '''此处派生是为了,继承父类的初始化属性,并初始化自己的属性''' |
| def __init__(self,参数1,参数2,派生类自己的参数): |
| |
| |
| super().__init__(参数1,参数2) |
| |
【三】详解
【1】指名道姓
| class Father(object): |
| def __init__(self,name,age): |
| self.name = name |
| self.age = age |
| self.father_run =self.run |
| |
| def run(self): |
| print(f"Father.run") |
| |
| class Son(Father): |
| def __init__(self,name,age,level): |
| '''指名道姓的声明''' |
| Father.__init__(self,name,age) |
| self.level = level |
| def run(self): |
| |
| Father.run(self) |
| print(f"Son.run") |
| |
| s = Son('son',5,'son') |
| print(s.__dict__) |
| s.run() |
| |
| |
【2】super()
| class Father(object): |
| def __init__(self,name,age): |
| self.name = name |
| self.age = age |
| self.father_run =self.run |
| |
| def run(self): |
| print(f"Father.run") |
| |
| class Son(Father): |
| def __init__(self,name,age,level): |
| super().__init__(name,age) |
| self.level = level |
| def run(self): |
| |
| super().run() |
| print(f"Son.run") |
| |
| s = Son('son',5,'son') |
| print(s.__dict__) |
| s.run() |
| |
| |
| |
| class A: |
| def run(self): |
| super().run() |
| print("A.run") |
| |
| class B: |
| def run(self): |
| print("B.run") |
| |
| class C(A,B): |
| pass |
| |
| c = C() |
| c.run() |
| |
| |
【3】super()
与mro()
super()
用于以一种一致而可预测的方式调用父类的方法,它遵循方法解析顺序(MRO)以确定应该查找哪个类的方法。
| '''引:c.test() 的结果是什么?报错还是输出内容''' |
| class A: |
| def test(self): |
| |
| super().test() |
| |
| |
| class B: |
| def test(self): |
| print('from B') |
| |
| |
| class C(A, B): |
| pass |
| |
| c = C() |
| c.test() |
| class A: |
| def test(self): |
| super().test() |
| |
| |
| class B: |
| def test(self): |
| print('from B') |
| |
| |
| class C(A, B): |
| pass |
| |
| c = C() |
| c.test() |
| |
| |
| |
| print(C.mro()) |
| |
- 类
C
的 MRO 是由类定义中基类的顺序确定的。在这种情况下是 C(A, B)
,所以 MRO 是 [C, A, B]
。当你调用 c.test()
时,它会在 MRO 列表中的第一个类中(C
)查找 test
方法,如果找不到,它会移到下一个类(A
),以此类推。
- 因此,在类
A
的 test
方法中,当你使用 super().test()
时,它会在 MRO 中的下一个类中查找 test
方法,也就是 B
。这样,它确保了方法是从 MRO 中的下一个类中调用的,提供了一种一致而可预测的导航类层次结构的方式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了