Return class 实例化时的不同类型?

Return different type upon class instantiation?

所以我正在制作我自己的 Complex class 版本,它用作虚数的表示: Complex(a, b) 其中 a + bi。

事实是,我想 return 根据给定的论点做些别的事情。我很确定我必须使用魔术方法 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 变量分配数值。不是某种 class 伪装成它不是的东西的字符串解决方案。我该怎么做?

感谢回复:))

Not some sort of to-string solution where the class pretends to be something it is not.

不过,这不正是您使用 __str__ 的目的吗?也许我没有正确理解你,但如果你担心你无法对你的对象进行数学运算,你只需实施相关的魔术方法,例如 __add__.

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

创建 class Complex 的实例时会发生以下情况:

  1. 你写Complex(a, b).
  2. Complex.__new__(a, b) 被调用,默认情况下(也就是说,如果你不重写 __new__ 方法)这个 return 是一个 [=12= 类型的空对象].
  3. 如果由 Complex.__new__(a, b) 编辑的对象 return(我们将其表示为 cmplx)实际上是 Complex 类型,则调用 cmplx.__init__(a, b),或等价地, Complex.__init__(cmplx, a, b).

对于你的情况,当调用第二个参数时,只需在 __new__ 方法中 return 一个 int,然后调用超级 [=] 的 __new__ 方法39=] 否则。即:

class Complex:
    def __new__(cls, a, b):
        if b == 0:
            return a
        return super().__new__(cls)  # or equiv.: object.__new__(cls)

如前所述,new 比其他解决方案容易得多,因为所有内容都组合在一起。您可以只说如果第二个参数为零,则 return a 否则再次调用 __new__

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