fiz*_*x00 8 python oop overriding operator-overloading python-3.x
如果我想改变继承方法的行为,我会这样做:
class a:
def changeMe(self):
print('called a')
class b(a):
def changeMe(self):
print('called b')
Run Code Online (Sandbox Code Playgroud)
我相信这是Python 中重写的一个例子。
但是,如果我想重载一个运算符,我会做一些非常类似的事情:
class c:
aNumber = 0
def __add__(self, operand):
print("words")
return self.aNumber + operand.aNumber
a = c()
b = c()
a.aNumber += 1
b.aNumber += 2
print(a + b) # prints "words\n3"
Run Code Online (Sandbox Code Playgroud)
我认为也许运算符方法在 python 中确实被重写了,因为我们使用可选参数进行重载,并且我们只是将其称为不符合约定的运算符重载。
但它也不可能是覆盖,'__add__' in object.__dict__.keys()因为False; 方法需要是父类的成员才能被重写(并且所有类object在创建时都继承自)。
我的理解差距在哪里?
我想既然最初的问题专门询问了我自己理解上的差距,我最适合回答它。去搞清楚。
我不明白的是,重写依赖于继承,而重载则不然。相反,Python 仅根据名称匹配重载方法。
子类要重写方法,该方法确实需要存在于父类中。因此,该def __add__部分不是重写的示例。
(在这种情况下,我也没有完全理解,如果解释器看到一个+运算符,它会在操作数的类中查找__add__ 魔术方法的定义。)
因为该+运算符本质上是 的别名__add__(),所以使用相同的名称。运算符重载实际上是重载的一个示例,因为当使用新颖的参数(在我的示例中为 class 的对象)调用名称(+或)时,我们正在更改名称( 或 )的行为。__add__c