Skip to content

重写

当父类的方法实现不能满足子类需求时,可以对方法进行重写(override)

重写父类方法有两种情况:

  1. 覆盖父类的方法
  2. 对父类方法进行 扩展

覆盖父类的方法

如果在开发中,父类的方法和子类的方法完全不同 ,就可以使用覆盖的方式,在子类中重新编写父类的方法实现。

也就是在子类中定义了一个和父类同名的方法并且实现。重写之后,在运行时,只会调用子类中重写的方法,而不再会调用父类封装的方法。

对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法,而只关注你在子类中定义的相应方法。

老虎在吃东西时,会发出咔~咔~咔~的声音的声音,这样原有的 eat() 方法就不能满足我们的需求了,需要重新实现一个 eat 方法才行。

python
def eat(self):
    print(self.name, '正在吃东西')
    print('发出咔~咔~咔~的声音')

当子类的函数名与父类的函数名一致时,当子类函数名不存在时,就会向上查找父类的名字。

如果只需要在父类的方法里面添加新的内容时,可以部分重写

python
def eat(self):
    super().eat()
    print('发出咔~咔~咔~的声音')

完整代码

python
class Animal(object):
    def __init__(self, name, high, weight):
        self.name = name
        self.high = high
        self.weight = weight

    def eat(self):
        print(f'{self.name} 正在吃东西')


class Tiger(Animal):
    def __init__(self, name, high, weight):
        super().__init__(name, high, weight)

    def bark(self):
        print(f'{self.name} 正在嗷呜叫~~~')

    def tiger_skill(self):
        print(f'来自丛林之王 {self.name} 必杀技')

        # 当子类的方法与父类的方法名是一样的时候,就是重写  

    # 重写会覆盖父类的方法,并不会修改父类的方法  
    def eat(self):
        print(f'{self.name} 正在吃东西, 发出咔咔咔的声音')


class Lion(Animal):
    def __init__(self, name, high, weight):
        super().__init__(name, high, weight)

    def bark(self):
        print(f'{self.name} 正在吼吼叫~~~')

    def lion_skill(self):
        print(f'来自草原之王 {self.name} 必杀技')

    def eat(self):
        # 了解就行: 可以通过 super() 调用父类的方法  
        super().eat()
        # print(f'{self.name} 正在吃东西')  
        # 下面部分是自己的逻辑,上面部分与父类保持一致  
        print(f'{self.name} 发出嘶嘶嘶的声音')


tiger = Tiger('泰哥', 1.88, 360)
lion = Lion('辛巴', 2, 380)

tiger.eat()
# lion --> Lion 类 --> Animal 类 --> object 类 还是没有就会报错  
lion.eat()

对父类方法进行扩展

如果在开发中,子类的方法实现中包含父类的方法实现,父类原本封装的方法实现是子类方法的一部分,就可以使用扩展的方式。

  1. 在子类中重写父类的方法
  2. 在需要的位置使用 super().父类方法 来调用父类方法的执行
  3. 代码其他的位置针对子类的需求,编写 子类特有的代码实现
python
"""  
    给列表添加新的功能,移除指定内容并且返回  
"""
import typing as t


class ArrayList(list):

    def remove(self, __value) -> t.Any:
        _index = self.index(__value)
        return self.pop(_index)


arr = ['a', 'b', 'c', 'd', 'e', 'f']
arr = ArrayList(arr)
value = arr.remove('c')
print(value)

super

Pythonsuper 是一个特殊的类

super() 就是使用 super 类创建出来的对象

最常使用的场景就是在重写父类方法时,调用在父类中封装的方法实现。