0

我正在通过在线 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

4

2 回答 2

0

该链接解释了 Python 2 并且您正在 Python 3 上尝试它。可以详细解释差异(如果您想知道,请查找“旧式类”与“新式类”),但它恢复为:__imul__如果在实例上定义了类似的特殊方法,现在总是会被忽略。只有在实例的上定义它们时才会调用它们。所以这条线

c.__imul__ = lambda B: B.n - 6

没有定义+=操作符行为的预期效果:c只是类的一个实例C

于 2013-05-23T21:19:35.527 回答
0

实际上,代码在 python 2 中按预期工作,但在 python 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
于 2013-05-23T21:33:39.257 回答