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

所以我正在制作我自己版本的 Complex 类,它可以表示虚数:Complex(a, b) where a + bi。


问题是,我想根据给定的参数返回其他东西。我很确定我必须使用新的魔术方法,但我似乎无法处理给定的参数。例如:


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 变量分配数值。不是某种 to-string 解决方案,类伪装成它不是的东西。我怎样才能做到这一点?


感谢您的回复:))


慕标5832272
浏览 135回答 3
3回答

德玛西亚99

正如其他人在评论中指出的那样,这正是__new__目的。以下是创建类的实例时发生的情况Complex:你写Complex(a, b)。Complex.__new__(a, b)被调用,并且默认情况下(即,如果您不覆盖该__new__方法)这将返回一个类型为 的空对象Complex。如果Complex.__new__(a, b)(我们将其表示为cmplx)返回的对象实际上是 type Complex, callcmplx.__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)

POPMUISE

不是某种 to-string 解决方案,类伪装成它不是的东西。不过,这不正是您要使用__str__的吗?也许我没有正确理解您,但是如果您担心无法对对象进行数学运算,则只需实现相关的魔术方法,例如__add__.

慕尼黑5688855

如前所述,new它比其他解决方案容易得多,因为一切都组装在一起。您可以只说如果第二个参数为零,则再次返回aelse 调用__new__。我这可能正是您所需要的,因为您指出您很难找到解决方案。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python