笨办法44继承与组合-super
2021/8/7 23:08:15
本文主要是介绍笨办法44继承与组合-super,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
隐式继承:子类的动作完全等同于父类上的动作
class Parent(object): def implicit(self): print("PARENT implicit()") class Child(Parent): pass dad = Parent() son = Child() dad.implicit() son.implicit()
运行结果:
D:\pytest\venv\Scripts\python.exe D:/pytest/ex44.py PARENT implicit() PARENT implicit()
显式覆盖:子类上的动作完全覆盖了父类上的动作
class Parent(object): def override(self): print("PARENT override()") class Child(Parent): def override(self): print("CHILD override()") dad = Parent() son = Child() dad.override() son.override()
运行结果:
D:\pytest\venv\Scripts\python.exe D:/pytest/ex44.py PARENT override() CHILD override()
son.override()打印出来的是Child.override里的消息,
因为son是Child的一个实例,而子类中新定义的函数在这里取代了父类里的函数
在运行前或运行后替换:子类上的动作部分替换了父类上的动作
class Parent(object): def altered(self): print("PARENT altered()") class Child(Parent): def altered(self): print("CHILD, BEFORE PARENT altered()") super(Child, self).altered() print("CHILD, AFTER PARENT altered()") dad = Parent() son = Child() dad.altered() son.altered()
运行结果:
D:\pytest\venv\Scripts\python.exe D:/pytest/ex44.py PARENT altered() CHILD, BEFORE PARENT altered() PARENT altered() CHILD, AFTER PARENT altered()
重要的是Child中的第9-11行,当调用son.altered()时,玩成了如下操作:
1. 由于覆盖了Parent.altered,实际运行的是Child.altered,所以第9行的运行结果是预料之中的
2. 这里我想在前面和后面加一个动作,所以第9行之后要用super来获取父类的Parent.altered的版本
3. 在第10行,我调用了super(Child, self).altered()方法,这个方法能够意识到继承的发生,并会访问到Parent类
你可以这样读这行代码“用Child和self这两个参数调用super,然后不管它返回什么,调用方法altered ”
4. 在这种情况下,父类的Parent.altered版本执行,并打印出父类Parent里的消息
5. 最后,代码从Parent.altered 返回, Child.altered函数继续打印出剩下的信息
将以上3种继承方式组合使用
# coding=utf-8 class Parent(object): def override(selfs): print("PARENT override()") def implicit(self): print("PARENT implicit") def altered(self): print("PARENT altered()") class Child(Parent): def override(self): print("CHILD override()") def altered(self): print("CHILD,BEFORE PARENT altered()") super(Child, self).altered() print("CHILD, AFTER PARENT altered()") dad = Parent() son = Child() dad.implicit() son.implicit() dad.override() son.override() dad.altered() son.altered()
运行结果:
D:\pytest\venv\Scripts\python.exe D:/pytest/ex44a.py PARENT implicit PARENT implicit PARENT override() CHILD override() PARENT altered() CHILD,BEFORE PARENT altered() PARENT altered() CHILD, AFTER PARENT altered()
组合
# coding=utf-8 class Other(object): def override(self): print("OTHER override()") def implicit(self): print("OTHER implicit()") def altered(self): print("OTHER altered()") class Child(object): def __init__(self): self.other = Other() def implicit(self): self.other.implicit() def override(self): print("CHILD override()") def altered(self): print("CHILD, BEFORE OTHER altered()") self.other.altered() print("CHILD, AFTER OTHER altered()") son = Child() son.implicit() son.override() son.altered()
运行结果:
D:\pytest\venv\Scripts\python.exe D:/pytest/ex44a.py PARENT implicit PARENT implicit PARENT override() CHILD override() PARENT altered() CHILD,BEFORE PARENT altered() PARENT altered() CHILD, AFTER PARENT altered()
组合里没有使用Parent这个名称,因为不是父类子类的关系,而是一个A里有B的关系,这里Child里有一个Other用来玩成它的功能
这篇关于笨办法44继承与组合-super的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-06责任分配矩阵在项目管理中的作用:结合工具提升团队生产力
- 2025-01-06板栗看板:优化项目管理的实用策略,助你轻松完成任务
- 2025-01-06电商小白怎么选取合适的工具?一站式工具指南来啦
- 2025-01-06企业如何避免春节期间的项目断层?四大方法教给你!
- 2025-01-06初创团队如何在动态环境下利用看板工具快速迭代
- 2025-01-06企业内部管理如何实现高效?四大策略教会你
- 2025-01-06给 Postgres 写一个向量插件 - 向量类型
- 2025-01-06电商蛇年营销新篇章:看板软件打造高效、精准营销体系
- 2025-01-06初创团队如何利用看板工具高效推进产品开发
- 2025-01-06IT项目经理的日常工作是什么?职责与所需技能大解析