Python 重载问题

2022-03-21 21:36:20 +08:00
 woshichuanqilz

比如这个代码

class Bird:
    #鸟有翅膀
    def isWing(self):
        print("鸟有翅膀")
    #鸟会飞
    def fly(self):
        print("鸟会飞")
class Ostrich(Bird):
    # 重写 Bird 类的 fly()方法
    def fly(self):
        print("鸵鸟不会飞")
# 创建 Ostrich 对象
ostrich = Ostrich()
#调用 Ostrich 类中重写的 fly() 类方法
ostrich.fly()

父类 bird 中有一个 fly()方法,子类 Ostrich 继承了 bird 类, 子类 Ostrich 中的 fly()方法会覆盖父类 bird 中的 fly()方法,这个如何避免, 我想让子类 Ostrich 中的 fly()方法不覆盖父类 bird 中的 fly()方法,

我不想修改父类的内容, 因为父类被很多地方调用了

2567 次点击
所在节点    Python
9 条回复
imn1
2022-03-21 21:48:40 +08:00
类内
super().fly()

类外
Bird().fly()
JeffGe
2022-03-21 21:54:34 +08:00
我不确定我是否明白你的意思,你可能对“覆盖”这个词有误解,子类 Ostrich.fly 方法并不会替换掉 Bird.fly 方法,只是 Ostrich 实例在调用 fly 方法时会优先寻找 Ostrich.fly 方法并调用,从而“覆盖”或者说“屏蔽”了 Bird.fly 方法,其它继承 Bird 类的子类不会受到 Ostrich 方法重载的影响
ZztGqk
2022-03-21 22:41:25 +08:00
话说这不是叫重写( Override )么。还有应该需要先理解一下多态。
omtow
2022-03-21 22:50:20 +08:00
你可以了解下 Python 的 MRO (Method Resolution Order),可能会对你有帮助
BeautifulSoap
2022-03-21 23:03:22 +08:00
1. LZ 你可能误解了“重载”这个词的意思,建议学习下(不如说 python 就没有重载这个概念)

2. lz 问题的答案: :super(Bird, ostrich).fly()
ixuuux
2022-03-21 23:03:38 +08:00
在 print(“鸵鸟不会飞”)的上面,加上一句 super().fly()。会完整执行父类的 fly()
Leviathann
2022-03-21 23:12:28 +08:00
不会修改被继承的类的。。
ospider
2022-03-22 08:31:55 +08:00
现在已经不流行 inheritance 了,更倾向于 composition 。
lizytalk
2022-03-22 17:54:50 +08:00
用 super 是正解,只是你写的不对而已,楼上的几位老哥说的很对。
这个不叫重载,重载是 overload ,这个是 override

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/841957

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX