比如这个代码
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()方法,
我不想修改父类的内容, 因为父类被很多地方调用了
![]() | 1 imn1 2022-03-21 21:48:40 +08:00 ![]() 类内 super().fly() 类外 Bird().fly() |
我不确定我是否明白你的意思,你可能对“覆盖”这个词有误解,子类 Ostrich.fly 方法并不会替换掉 Bird.fly 方法,只是 Ostrich 实例在调用 fly 方法时会优先寻找 Ostrich.fly 方法并调用,从而“覆盖”或者说“屏蔽”了 Bird.fly 方法,其它继承 Bird 类的子类不会受到 Ostrich 方法重载的影响 |
![]() | 3 ZztGqk 2022-03-21 22:41:25 +08:00 话说这不是叫重写( Override )么。还有应该需要先理解一下多态。 |
![]() | 4 omtow 2022-03-21 22:50:20 +08:00 via iPhone 你可以了解下 Python 的 MRO (Method Resolution Order),可能会对你有帮助 |
![]() | 5 BeautifulSoap 2022-03-21 23:03:22 +08:00 ![]() 1. LZ 你可能误解了“重载”这个词的意思,建议学习下(不如说 python 就没有重载这个概念) 2. lz 问题的答案: :super(Bird, ostrich).fly() |
![]() | 6 ixuuux 2022-03-21 23:03:38 +08:00 via iPhone 在 print(“鸵鸟不会飞”)的上面,加上一句 super().fly()。会完整执行父类的 fly() |
7 Leviathann 2022-03-21 23:12:28 +08:00 不会修改被继承的类的。。 |
![]() | 8 4BVL25L90W260T9U 2022-03-22 08:31:55 +08:00 现在已经不流行 inheritance 了,更倾向于 composition 。 |
![]() | 9 lizytalk 2022-03-22 17:54:50 +08:00 用 super 是正解,只是你写的不对而已,楼上的几位老哥说的很对。 这个不叫重载,重载是 overload ,这个是 override |