Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python TypeError:不支持的操作数类型*=_Python_Typeerror_Python 3.3_Operand - Fatal编程技术网

Python TypeError:不支持的操作数类型*=

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:不支持*=:

我通过一本在线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:不支持*=:“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对象被构造时,它应该被传递到一个变量中。它在哪里存储那个变量?