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

2024-10-05 17:38:33 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我正在制作一个复数类的我自己的版本,它作为虚数的表示:复数(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变量赋值。不是某种类型的字符串解决方案,其中类假装是它不是的东西。我该怎么做?你知道吗

感谢回复:))


Tags: 方法字符串版本类型new参数魔法解决方案
3条回答

如前所述,new比其他解决方案简单得多,因为所有的解决方案都是组合在一起的。你可以说如果第二个参数为零,那么返回a,否则再次调用__new__。你知道吗

我认为这可能正是你需要的,因为你指出你在努力寻找解决方案。你知道吗

正如其他人在评论中指出的,这正是__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)。你知道吗

对于您的情况,只需在调用第二个参数时在__new__方法中返回int,否则调用超类的__new__方法。即:

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

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

这不正是你使用__str__的目的吗?也许我没有正确地理解你,但是如果你担心你不能用你的对象做数学运算,你只需要实现相关的魔法方法,比如__add__。你知道吗

相关问题 更多 >