Python中object类未定义的魔法方法为何能被子类使用?
为什么未在object中定义的魔法方法能被子类使用?
首先明确两个核心结论:魔法方法的调用逻辑不依赖父类是否预定义,继承object类和这类方法的可用性没有直接绑定关系。
1. 魔法方法由Python解释器直接触发调用
当你使用a + b这类语法时,Python解释器不会走普通的属性继承查找流程,而是直接尝试调用左侧对象的__add__方法——不管这个方法是继承来的,还是子类自己定义的。
比如你示例中的Num类,虽然object没有__add__,但你自己实现了这个方法,解释器就会直接调用它完成加法操作。如果没有定义__add__,解释器才会尝试后续的 fallback(比如调用右侧对象的__radd__),如果都没有,就抛出TypeError提示不支持加法操作。
2. object类仅提供通用基础的魔法方法实现
object作为所有类的基类,只实现了所有对象都需要的通用魔法方法,比如:
__eq__:默认比较对象的内存地址__hash__:默认基于内存地址生成哈希值__repr__、__str__:默认的字符串表示
像__add__、__mul__这类属于特定类型的行为方法,只有数值、序列等需要进行运算的类才需要实现,object没必要提供默认实现——否则所有对象都能执行加法,这显然不符合逻辑。
3. 继承object的作用不包含“提供所有魔法方法”
继承object(Python 3中默认继承,无需显式声明)是为了让子类获得通用的对象特性(比如垃圾回收、属性管理等),而不是为了获得所有魔法方法的实现。你完全可以在子类中任意实现未在object中定义的魔法方法,只要符合Python的魔法方法规范,解释器就能识别并调用。
用你的示例代码验证:
class Num(object): def __init__(self, n): self.n = n def __eq__(self, other): return (self.n>=other.n) and (self.n<=other.n) def __add__(self, other): return self.n + other.n a = Num(10) b = Num(20) print(a==b) # False:这里调用的是你重写的__eq__,如果没重写会用object默认的内存地址比较 print(a+b) # 30:调用你定义的__add__,和object是否有这个方法无关
内容的提问来源于stack exchange,提问作者Park
相关产品推荐
相关产品推荐

