本文目录导读:

在Python中,方法重写(Method Overriding)是面向对象编程的重要特性,子类可以重新定义父类中已有的方法,以下是详细的重写方法和案例:
基本语法
class Parent:
def method(self):
# 父类的实现
pass
class Child(Parent):
def method(self):
# 子类重写父类方法
# 新实现
pass
案例1:基础重写
class Animal:
def speak(self):
return "动物发出声音"
def move(self):
return "动物在移动"
class Dog(Animal):
def speak(self):
return "汪汪汪!"
def move(self):
return "狗在奔跑"
class Cat(Animal):
def speak(self):
return "喵喵喵!"
def move(self):
return "猫在悄悄走"
# 使用
animals = [Animal(), Dog(), Cat()]
for animal in animals:
print(animal.speak(), "|", animal.move())
# 输出:
# 动物发出声音 | 动物在移动
# 汪汪汪! | 狗在奔跑
# 喵喵喵! | 猫在悄悄走
案例2:调用父类方法
class Shape:
def __init__(self, color):
self.color = color
def area(self):
return 0
def info(self):
return f"这是一个{self.color}色的形状"
class Circle(Shape):
def __init__(self, color, radius):
# 调用父类构造函数
super().__init__(color)
self.radius = radius
def area(self):
# 重写并调用父类方法
base_area = super().area() # 可以调用父类的原始实现
return 3.14 * self.radius ** 2
def info(self):
# 扩展父类方法的功能
parent_info = super().info()
return f"{parent_info},半径为{self.radius}的圆"
# 使用
circle = Circle("红色", 5)
print(circle.info()) # 这是一个红色的形状,半径为5的圆
print(f"面积:{circle.area()}") # 面积:78.5
案例3:完全重写(不调用父类)
class Calculator:
def calculate(self, a, b):
return a + b
class AdvancedCalculator(Calculator):
def calculate(self, a, b):
# 完全重写,不调用父类方法
return a * b + a + b # 完全不同的计算逻辑
class StringCalculator(Calculator):
def calculate(self, a, b):
# 完全不同的功能
return f"{a} 和 {b} 的组合"
# 使用
calc = Calculator()
adv_calc = AdvancedCalculator()
str_calc = StringCalculator()
print(calc.calculate(5, 3)) # 8
print(adv_calc.calculate(5, 3)) # 23
print(str_calc.calculate(5, 3)) # 5 和 3 的组合
案例4:重写特殊方法
class Number:
def __init__(self, value):
self.value = value
def __str__(self):
return f"数字:{self.value}"
class EvenNumber(Number):
def __init__(self, value):
if value % 2 != 0:
raise ValueError("必须是偶数")
super().__init__(value)
def __str__(self):
# 重写特殊方法
return f"偶数:{self.value}"
def __add__(self, other):
# 重写加法运算符
if isinstance(other, EvenNumber):
return EvenNumber(self.value + other.value)
return NotImplemented
# 使用
num1 = EvenNumber(4)
num2 = EvenNumber(6)
print(num1) # 偶数:4
print(num1 + num2) # 偶数:10
案例5:多层继承重写
class Vehicle:
def start(self):
return "车辆启动"
def stop(self):
return "车辆停止"
class Car(Vehicle):
def start(self):
return "汽车启动,发动机轰鸣"
def park(self):
return "汽车正在停车"
class ElectricCar(Car):
def start(self):
# 重写并调用祖父类方法
vehicle_start = super(Car, self).start() # 调用Vehicle的start
return f"电动车静音启动,{vehicle_start}"
def stop(self):
# 重写父类方法
return "电动车刹车能量回收"
# 使用
tesla = ElectricCar()
print(tesla.start()) # 电动车静音启动,车辆启动
print(tesla.stop()) # 电动车刹车能量回收
print(tesla.park()) # 汽车正在停车
重要注意事项
参数一致性
class Base:
def process(self, data, multiplier=1):
return data * multiplier
class Child(Base):
# 推荐:保持签名一致
def process(self, data, multiplier=1):
return super().process(data, multiplier) * 2
# 不推荐:改变签名可能会引起问题
# def process(self, data, multiplier=1, additional=0):
# return data * multiplier + additional
使用super()的推荐方式
class Parent:
def method(self):
print("Parent method")
class Child(Parent):
def method(self):
# Python 3 推荐方式
super().method()
print("Child additional code")
# 或者使用类名(不推荐,但兼容旧版本)
# Parent.method(self)
抽象方法重写
from abc import ABC, abstractmethod
class AbstractShape(ABC):
@abstractmethod
def area(self):
pass
class Square(AbstractShape):
def __init__(self, side):
self.side = side
def area(self): # 必须重写
return self.side ** 2
调试技巧
class Logger:
def action(self):
print("父类方法执行")
class DebugLogger(Logger):
def action(self):
# 使用breakpoint()或print调试
print(f"调用者:{self.__class__.__name__}")
print("准备调用父类方法")
result = super().action()
print("父类方法执行完毕")
return result
# 使用
dl = DebugLogger()
dl.action()
# 输出:
# 调用者:DebugLogger
# 准备调用父类方法
# 父类方法执行
# 父类方法执行完毕
掌握方法重写是Python OOP编程的基础,合理使用可以提高代码的复用性和可维护性。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播