python之重写父类方法

博客围绕Python重写父类方法展开,指出重写目的是扩展功能,因父类方法已无法满足需求,其核心思想是先调用要重写的父类方法。

python之重写父类方法

修改父类的方法
重写父类的方法的目的是为了给他扩展功能,父类的方法已经不能满足需求
核心思想就一句话,先调用一下你要重写的父类方法,


class Coon(object):
    #基本类
    def __init__(self,host,password,port):
        self.host=host
        self.password = password
        self.port = port

class CoonMysql(Coon):
    def __init__(self,host,password,port,username,db,charset='utf8'):
        Coon.__init__(self,host,password,port)#调用父类的构造方法
        # super(CoonMysql,self).__init__(host,passwd,port)#和上面一句的实现效果一模一样
        #第一句是手动调用父类方法,第二句是super自动找到父类,帮助调用父类方法
        self.username=username
        self.db=db
        self.charset=charset
    def coon_mysql(self):
        self.port

转载于:https://blog.51cto.com/jinmy/2165180

<think>我们正在讨论Python重写父类的含参方法。根据用户提供的引用,特别是引用[2]和引用[3],我们知道重写父类方法时,子类可以定义与父类同名的方法,并且如果需要保留父类的功能,可以使用super()来调用父类方法,然后添加子类特有的功能。重写带参数的方法重写无参数方法类似,但需要注意在子类方法中正确地传递参数。 步骤: 1.在子类中定义与父类同名的方法,包括相同的参数(参数名可以不同,但数量和含义应一致)。2.在子类方法中,如果需要调用父类的原方法,使用super().方法名(参数)来调用,并传入相应的参数。3.添加子类特有的代码。 示例: 假设有一个父类Animal,其中有一个带参数的方法:```pythonclassAnimal:defeat(self, food):print(f"动物吃{food}")``` 现在,我们创建一个子类Dog,重写eat方法,在调用父类方法前后添加一些行为: ```pythonclass Dog(Animal):def eat(self,food):#子类特有的行为print("狗看到食物摇尾巴")#调用父类的eat方法super().eat(food)#子类特有的行为print("狗吃完了,汪汪叫")#创建Dog对象并调用eat方法dog= Dog() dog.eat("骨头") ```输出:``` 狗看到食物摇尾巴动物吃骨头狗吃完了,汪汪叫``` 注意:-参数传递:子类方法中的参数需要传递给父类方法,如上例中的`food`。-如果父类方法有多个参数,子类方法需要相应定义这些参数,并在调用super时传递。特殊情况:如果子类方法需要改变参数的数量或类型,那么需要谨慎设计,因为这可能违反里氏替换原则。通常,子类方法应该保持与父类方法相同的接口(参数数量和类型),但可以有不同的实现。另外,引用[4]提到,如果父类方法是私有方法(以双下划线开头),则不能直接重写,因为Python会进行名称修饰。但通常我们不建议重写私有方法。因此,重写父类的含参方法的关键是保持参数一致,并在需要时使用super()调用父类方法。相关问题:1.在重写父类方法时,如何确保父类方法被正确调用?2.重写方法时参数不一致会导致什么问题?3.在Python中,如何防止子类重写父类的特定方法?</think>### 如何在Python重写父类的含参方法Python重写父类的含参方法需要遵循以下关键步骤: #### 1. **定义同名方法** 在子类中创建与父类**同名且参数列表相同**的方法: ```python class Parent: def calculate(self, a, b): # 父类含参方法 return a + b class Child(Parent): def calculate(self, x, y): # 子类重写同名方法 return super().calculate(x, y) * 2 # 调用父类方法并扩展 ``` #### 2. **正确传递参数** 通过`super()`调用父类方法时,**必须显式传递所有参数**: ```python class Child(Parent): def calculate(self, num1, num2): # 正确传递参数给父类方法 parent_result = super().calculate(num1, num2) return parent_result ** 2 ``` #### 3. **参数扩展(可选)** 如需扩展参数,建议保持基础参数一致,通过`*args/**kwargs`处理额外参数: ```python class Child(Parent): def calculate(self, a, b, scale=1): # 添加新参数 result = super().calculate(a, b) return result * scale # 使用新参数扩展功能 ``` #### 4. **完整示例** ```python class Vehicle: def move(self, distance, speed): # 父类含参方法 print(f"移动{distance}公里,时速{speed}km/h") class Car(Vehicle): def move(self, dist, spd, fuel_consumption): # 重写并添加新参数 super().move(dist, spd) # 调用父类方法 print(f"油耗:{dist * fuel_consumption}升") # 使用示例 my_car = Car() my_car.move(100, 60, 0.08) # 距离,速度,油耗系数 ``` 输出: ``` 移动100公里,时速60km/h 油耗:8.0升 ``` #### 关键注意事项: 1. **参数一致性**:子类方法参数应与父类**基础参数数量和类型匹配**,否则会破坏多态性[^2] 2. **super()使用**:必须通过`super().method(args)`调用父类实现,直接写父类名可能导致继承问题[^3] 3. **私有方法**:双下划线方法(如`__method`)会被名称修饰,不建议重写[^4] 4. **参数命名**:子类参数名可与父类不同,但**位置顺序必须一致** > 通过重写含参方法,子类可扩展父类行为:保留核心功能(通过super调用)的同时添加新特性,实现"扩展式重写"[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值