在类实例化时返回不同的类型?

时间:2019-09-08 21:31:40

标签: python return instantiation

因此,我正在制作自己的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变量分配数值。这不是类伪装成某种不是的字符串解决方案。我该怎么办?

感谢您的回复:))

3 个答案:

答案 0 :(得分:3)

正如其他人在评论中指出的,这正是__new__的目的。

当您创建类Complex的实例时,会发生以下情况:

  1. 您写了Complex(a, b)
  2. Complex.__new__(a, b)被调用,并且默认情况下(即,如果您不覆盖__new__方法)将返回类型为Complex的空对象。
  3. 如果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__

这可能正是您所需要的,因为您指出自己在寻找解决方案方面遇到了困难。

相关问题