父类OTAReset为何调用子类重载的writeCarac?如何指定调用父类方法?
解决父类内部调用自身方法而非子类重载方法的问题
问题场景
你定义的父类与子类代码如下:
父类:
class Sensor(): def writeCarac(self, uuid, PAYLOAD=None): pass def OTAReset(self): self.writeCarac(0x1234, [1,2,3,4])
子类:
class sensortypeA(Sensor): def writeCarac(self, uuid): PAYLOAD = [] match uuid: case uuid1: PAYLOAD = [something] case uuid2: PAYLOAD = [something else] return super().writeCarac(uuid, PAYLOAD)
问题核心:调用子类实例的OTAReset时,父类内的self.writeCarac会执行子类重载的版本,而你需要它执行父类自身的writeCarac方法。
解决方案
方案1:直接通过父类名调用方法
在父类的OTAReset中,绕过动态绑定机制,直接用父类名称调用writeCarac并传入self作为参数:
class Sensor(): def writeCarac(self, uuid, PAYLOAD=None): pass def OTAReset(self): # 强制调用父类自身的writeCarac方法 Sensor.writeCarac(self, 0x1234, [1,2,3,4])
这种方式简单直接,无需修改子类代码,就能确保父类内部调用的是自身实现。
方案2:将父类方法设为私有(名称修饰)
如果希望父类的writeCarac仅能被自身内部调用,子类无法干扰,可以把方法名改为双下划线开头的私有方法,Python会自动对其做名称修饰:
class Sensor(): # 改为私有方法,Python会修饰为_Sensor__writeCarac def __writeCarac(self, uuid, PAYLOAD=None): pass def OTAReset(self): # 内部调用私有方法 self.__writeCarac(0x1234, [1,2,3,4])
此时子类若定义同名的__writeCarac,会被修饰为_sensortypeA__writeCarac,完全不影响父类内部的调用。注意子类中原本的super().writeCarac需要改为super()._Sensor__writeCarac才能调用父类的私有方法,适合严格隔离父类内部逻辑的场景。
内容的提问来源于stack exchange,提问作者proff
相关产品推荐
相关产品推荐

