Python父类方法重写(入门必读)

91 篇文章 0 订阅
91 篇文章 0 订阅

前面讲过在 [Python] 中,子类继承了父类,那么子类就拥有了父类所有的类属性和类方法。通常情况下,子类会在此基础上,扩展一些新的类属性和类方法。

但凡事都有例外,我们可能会遇到这样一种情况,即子类从父类继承得来的类方法中,大部分是适合子类使用的,但有个别的类方法,并不能直接照搬父类的,如果不对这部分类方法进行修改,子类对象无法使用。针对这种情况,我们就需要在子类中重复父类的方法。

举个例子,鸟通常是有翅膀的,也会飞,因此我们可以像如下这样定义个和鸟相关的类:


1.  class Bird:
2.  #鸟有翅膀
3.  def isWing(self):
4.  print("鸟有翅膀")
5.  #鸟会飞
6.  def fly(self):
7.  print("鸟会飞")

但是,对于鸵鸟来说,它虽然也属于鸟类,也有翅膀,但是它只会奔跑,并不会飞。针对这种情况,可以这样定义鸵鸟类:


1.  class Ostrich(Bird):
2.  # 重写Bird类的fly()方法
3.  def fly(self):
4.  print("鸵鸟不会飞")

可以看到,因为 Ostrich 继承自 Bird,因此 Ostrich 类拥有 Bird 类的 isWing() 和 fly() 方法。其中,isWing() 方法同样适合 Ostrich,但 fly() 明显不适合,因此我们在 Ostrich 类中对 fly() 方法进行重写。

重写,有时又称覆盖,是一个意思,指的是对类中已有方法的内部实现进行修改。

在上面 2 段代码的基础上,添加如下代码并运行:


1.  class Bird:
2.  #鸟有翅膀
3.  def isWing(self):
4.  print("鸟有翅膀")
5.  #鸟会飞
6.  def fly(self):
7.  print("鸟会飞")
8.  class Ostrich(Bird):
9.  # 重写Bird类的fly()方法
10.  def fly(self):
11.  print("鸵鸟不会飞")

13.  # 创建Ostrich对象
14.  ostrich = Ostrich()
15.  #调用 Ostrich 类中重写的 fly() 类方法
16.  ostrich.fly()

运行结果为:

鸵鸟不会飞

显然,ostrich 调用的是重写之后的 fly() 类方法。

如何调用被重写的方法

事实上,如果我们在子类中重写了从父类继承来的类方法,那么当在类的外部通过子类对象调用该方法时,Python 总是会执行子类中重写的方法。

这就产生一个新的问题,即如果想调用父类中被重写的这个方法,该怎么办呢?

很简单,前面讲过,Python 中的类可以看做是一个独立空间,而类方法其实就是出于该空间中的一个函数。而如果想要全局空间中,调用类空间中的函数,只需要在调用该函数是备注类名即可。举个例子:


1.  class Bird:
2.  #鸟有翅膀
3.  def isWing(self):
4.  print("鸟有翅膀")
5.  #鸟会飞
6.  def fly(self):
7.  print("鸟会飞")
8.  class Ostrich(Bird):
9.  # 重写Bird类的fly()方法
10.  def fly(self):
11.  print("鸵鸟不会飞")

13.  # 创建Ostrich对象
14.  ostrich = Ostrich()
15.  #调用 Bird 类中的 fly() 方法
16.  Bird.fly(ostrich)

程序运行结果为:

鸟会飞

此程序中,需要大家注意的一点是,使用类名调用其类方法,Python 不会为该方法的第一个 self 参数自定绑定值,因此采用这种调用方法,需要手动为 self 参数赋值。

通过类名调用实例方法的这种方式,又被称为未绑定方法。
python福利教程领取方式:
1、点赞+评论(勾选“同时转发”)
2、关注小编。并私信回复关键字【19】
(一定要私信哦~点击我的头像就能看到私信按钮了)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python,重写(Override)父类方法允许子类提供特定于自身的实现,并覆盖了其基础类的行为。这是面向对象编程(OOP)的重要特性之一,有助于代码复用及提高程序灵活性。 ### 语法: 当您需要在子类重写父类方法时,只需在子类定义一个新的函数,其名称、返回值类型和参数列表应完全匹配父类的相应方法。这确保了函数的同名、同类型和同参数数量。 例如: ```python class ParentClass: def display(self): print("This is the parent class method") class ChildClass(ParentClass): def display(self): # 这里重写了父类的display方法 print("This is the child class method") ``` 在这个例子,`ChildClass`继承自`ParentClass`并重写了`display`方法。 ### 参数处理: 在重写父类方法时,您可以修改对原始参数的处理逻辑或增加新的功能。参数可以保持不变、改变数量或添加默认值等。 ### 示例: ```python class ParentClass: def process_data(self, data): return "Processed data by ParentClass" class ChildClass(ParentClass): def process_data(self, data): result = super().process_data(data) + " - Additional processing" return result obj = ChildClass() print(obj.process_data('Sample Data')) # 输出:"Processed data by ParentClass - Additional processing" ``` 这里,`ChildClass`不仅重写了`process_data`方法,而且还在返回结果前进行了额外的操作。 ### 使用场景: - 当您希望子类基于父类的基本实现上做出一些定制化操作时。 - 父类方法不够适用于所有子类,需要针对特定需求提供更精确的实现时。 - 提高代码的复用性和可维护性,减少重复代码量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值