在我的复数类中加零

时间:2017-12-06 20:51:17

标签: python python-3.x class

我正在创建自己的复杂数字类(不使用内置的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,可以使用帮助。

3 个答案:

答案 0 :(得分:0)

int + complex将首先尝试使用int.__add__complex + int将首先尝试使用complex.__add__

您需要实施complex.__radd__。请参阅Emulating numeric types中的相关说明:

  

仅当左操作数不支持相应操作且操作数类型不同时才调用这些函数。

您需要处理otherintcomplex.__add__complex.__radd__的情况。

答案 1 :(得分:0)

当左侧操作数属于您正在编写的类型时,

__add__用于添加。当Python无法调用int __add__方法时,它会尝试__radd__。如果您定义__radd__(具有相同的行为),您将获得所需的结果。

答案 2 :(得分:0)

两个问题:

  1. 当您希望能够处理complex object + int时,您只处理向complex对象添加complex对象。

  2. 按此顺序添加(int +自定义类型)时,需要添加反射添加方法(__radd__

  3. 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)被认为是不好的风格。