我通过在线wikibook教自己Python,并且在其中一个带有重载运算符的示例中遇到了一个令人困惑的错误。根据例子:
class FakeNumber:
n = 5
def __add__(A,B):
return A.n + B.n
c = FakeNumber()
d = FakeNumber()
d.n = 7
c.__imul__ = lambda B: B.n - 6
c *= d
c
应该返回:
1
但我得到了:
TypeError: unsupported operand type(s) for *=: 'FakeNumber' and 'FakeNumber'
我知道你不能将对象加在一起,那么c.__imul__ = lambda B: B.n - 6
的重点是什么?有什么东西丢失了,或者哪里有不正确的语法?
参考:http://en.wikibooks.org/wiki/Python_Programming/Classes#Operator_Overloading
答案 0 :(得分:0)
该链接解释了Python 2,你在Python 3上尝试它。可以详细解释差异(如果你想知道的话,寻找“旧式类”与“新式类”),但它恢复为:如果在实例上定义了特殊方法,则__imul__
现在总是被忽略。只有在实例的类上定义它们时才会调用它们。这一行
c.__imul__ = lambda B: B.n - 6
没有定义+=
运算符行为的预期效果:c
只是类C
的一个实例。
答案 1 :(得分:0)
确实代码在python 2中正常工作,但在3中没有。在python 3中可能的修复方法如下:
class FakeNumber:
def __init__(self, i):
self.i = i
def __imul__(self, B):
self.i = self.i * B.i
return self
a = FakeNumber(5)
b = FakeNumber(6)
a *= b