我正在创建自己的复杂数字类(不使用内置的Python),当我尝试向我的复数添加零时,我遇到了问题。作为参考,这是错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "display.py", line 25, in __init__
t.color(mandelbrot(c).getColor())
File "C:\Users\Joe\Desktop\Python\mandelbrot.py", line 10, in __init__
z = z*z + self.__starting_value
TypeError: unsupported operand type(s) for +: 'int' and 'complex'
其中self .__ starting_value是复数。
添加定义如下:
class complex:
def __init__(self, a = 0, b = 0):
self.__real = float(a)
self.__imag = float(b)
def __add__(self, other):
return complex(self.__real + other.__real, self.__imag + other.__imag)
解决方案应该足够简单,但我仍在学习Python,可以使用帮助。
答案 0 :(得分:0)
int
+ complex
将首先尝试使用int.__add__
。 complex
+ int
将首先尝试使用complex.__add__
。
您需要实施complex.__radd__
。请参阅Emulating numeric types中的相关说明:
仅当左操作数不支持相应操作且操作数类型不同时才调用这些函数。
您需要处理other
和int
中complex.__add__
为complex.__radd__
的情况。
答案 1 :(得分:0)
__add__
用于添加。当Python无法调用int
__add__
方法时,它会尝试__radd__
。如果您定义__radd__
(具有相同的行为),您将获得所需的结果。
答案 2 :(得分:0)
两个问题:
当您希望能够处理complex
object + int时,您只处理向complex
对象添加complex
对象。
按此顺序添加(int +自定义类型)时,需要添加反射添加方法(__radd__
)
class complex:
def __init__(self, a = 0, b = 0):
self.__real = float(a)
self.__imag = float(b)
def __add__(self, other):
if isinstance(other, complex):
return complex(self.__real + other.__real, self.__imag + other.__imag)
else:
return complex(self.__real + other, self.__imag)
def __radd__(self, other):
return self + other
N.B。:阴影内置名称(如complex
)被认为是不好的风格。