打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
十五、Python父类方法重写(入门必读)
子类扩展了父类,子类是一种特殊的父类。大部分时候,子类总是以父类为基础,额外增加新的方法。但在一些场景中,子类需要重写父类的方法。

例如,鸟类都包含了飞翔方法,其中驼鸟是一种特殊的鸟类,因此驼鸟应该是鸟的子类,它也将从鸟类获得飞翔方法,但这个飞翔方法明显不适合驼鸟,为此,驼鸟需要重写鸟类的方法。

如下程序示范了子类重写父类的方法:
  1. class Bird:

  2. # Bird类的fly()方法

  3. def fly(self):

  4. print("我在天空里自由自在地飞翔...")

  5. class Ostrich(Bird):

  6. # 重写Bird类的fly()方法

  7. def fly(self):

  8. print("我只能在地上奔跑...")

  9. # 创建Ostrich对象

  10. os = Ostrich()

  11. # 执行Ostrich对象的fly()方法,将输出"我只能在地上奔跑..."

  12. os.fly()

运行上面程序,将看到运行 os.fly() 时执行的不再是 Bird 类的 fly() 方法,而是 Ostrich 类的 fly() 方法。

这种子类包含与父类同名的方法的现象被称为方法重写(Override),也被称为方法覆盖。可以说子类重写了父类的方法,也可以说子类覆盖了父类的方法。

使用未绑定方法调用被重写的方法

如果在子类中调用重写之后的方法,Python 总是会执行子类重写的方法,不会执行父类中被重写的方法。如果需要在子类中调用父类中被重写的实例方法,那该怎么办呢?

别忘了,Python 类相当于类空间,因此 Python 类中的方法本质上相当于类空间内的函数。所以,即使是实例方法,Python 也允许通过类名调用。区别在于:在通过类名调用实例方法时,Python 不会为实例方法的第一个参数 self 自动绑定参数值,而是需要程序显式绑定第一个参数 self。这种机制被称为未绑定方法

通过使用未绑定方法即可在子类中再次调用父类中被重写的方法。例如如下程序:
  1. class BaseClass:

  2. def foo (self):

  3. print('父类中定义的foo方法')

  4. class SubClass(BaseClass):

  5. # 重写父类的foo方法

  6. def foo (self):

  7. print('子类重写父类中的foo方法')

  8. def bar (self):

  9. print('执行bar方法')

  10. # 直接执行foo方法,将会调用子类重写之后的foo()方法

  11. self.foo()

  12. # 使用类名调用实例方法(未绑定方法)调用父类被重写的方法

  13. BaseClass.foo(self)

  14. sc = SubClass()

  15. sc.bar()

上面程序中 SubClass 继承了 BaseClass 类,并重写了父类的 foo() 方法。接下来程序在 SubClass 类中定义了 bar() 方法,该方法的第 11 行代码直接通过 self 调用 foo() 方法,Python 将会执行子类重写之后的 foo() 方法;第 13 行代码通过未绑定方法显式调用 BaseClass 中的 foo 实例方法,井显式为第一个参数 self 绑定参数值,这就实现了调用父类中被重写的方法。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
可能是最全的Python面向对象入门教程了
Python,你真的会使用 staticmethod 和 classmethod 吗?
零基础分分钟理解python面向对象那些事你也行!
Python开发基础总结(四)XML+time+OO
一日一技:在 Python 中编写抽象类
Mix-in技术介绍
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服