Python TypeError:不支持的操作数类型*=
我通过一本在线wikibook自学Python,在其中一个重载运算符的示例中遇到了一个令人困惑的错误。根据示例:Python TypeError:不支持的操作数类型*=,python,typeerror,python-3.3,operand,Python,Typeerror,Python 3.3,Operand,我通过一本在线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:不支持*=:
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:不支持*=:“FakeNumber”和“FakeNumber”的操作数类型
我知道你不能把物体相乘,那么c的意义是什么呢?是否缺少某些内容,或者哪里有不正确的语法
参考资料:该链接解释了Python 2,您正在Python 3上试用它。这种差异可以详细解释(如果你想知道的话,可以查找“旧样式类”和“新样式类”),但它可以恢复到:如果在实例上定义了特殊方法,例如
\uu imul\uu
,那么它们现在总是被忽略。只有在实例的类上定义它们时,才会调用它们。那么这条线呢
c.__imul__ = lambda B: B.n - 6
没有定义
+=
运算符行为的预期效果:c
只是类c
的一个实例。实际上,代码在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
@Armin_Rigo我对lambda不太在行;我该写些什么来解决这个问题呢?请看@Teisman的答案,通常不要使用lambdas。实际上,我不知道他们为什么在教学材料中使用lambdas。所以如果我没有弄错的话,当FakeNumber对象被构造时,它应该被传递到一个变量中。它在哪里存储那个变量?