因此,我正在制作自己的Complex类的版本,该类可以表示虚数:Complex(a,b),其中a + bi。
事情是,我想根据给定的参数返回其他内容。我非常确定我必须使用魔术方法 new ,但是我似乎无法处理给定的参数。例如:
a = Complex(4, 5)
print(a)
> Complex(4, 5)
b = Complex(3, 0)
print(b)
> 3
c = Complex(0, 0)
print(c)
> 0
我希望为b和c变量分配数值。这不是类伪装成某种不是的字符串解决方案。我该怎么办?
感谢您的回复:))
答案 0 :(得分:3)
正如其他人在评论中指出的,这正是__new__
的目的。
当您创建类Complex
的实例时,会发生以下情况:
Complex(a, b)
。Complex.__new__(a, b)
被调用,并且默认情况下(即,如果您不覆盖__new__
方法)将返回类型为Complex
的空对象。Complex.__new__(a, b)
返回的对象(我们将其表示为cmplx
)实际上是Complex
类型的,则调用cmplx.__init__(a, b)
或等效的Complex.__init__(cmplx, a, b)
。 对于您的情况,只需在调用第二个参数时在int
方法中返回__new__
,否则调用超类的__new__
方法。那就是:
class Complex:
def __new__(cls, a, b):
if b == 0:
return a
return super().__new__(cls) # or equiv.: object.__new__(cls)
答案 1 :(得分:0)
不是某种类伪装成的字符串解决方案 不是。
这不是您要使用的__str__
吗?也许我不太了解您,但是如果您担心无法对对象进行数学运算,则可以实施相关的魔术方法,例如__add__
。
答案 2 :(得分:0)
如前所述,new
比其他解决方案容易得多,因为所有内容都可以组合在一起。您可能只是说,如果第二个arg为零,则返回a
,否则再次调用__new__
。
这可能正是您所需要的,因为您指出自己在寻找解决方案方面遇到了困难。