为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕标5832272 2022-05-24 10:39:18
所以我正在制作我自己版本的 Complex 类,它可以表示虚数:Complex(a, b) where a + bi。问题是,我想根据给定的参数返回其他东西。我很确定我必须使用新的魔术方法,但我似乎无法处理给定的参数。例如:a = Complex(4, 5)print(a)> Complex(4, 5)b = Complex(3, 0)print(b)> 3c = Complex(0, 0)print(c)> 0我希望为 b 和 c 变量分配数值。不是某种 to-string 解决方案,类伪装成它不是的东西。我怎样才能做到这一点?感谢您的回复:))
查看完整描述

3 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

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

以下是创建类的实例时发生的情况Complex

  1. 你写Complex(a, b)

  2. Complex.__new__(a, b)被调用,并且默认情况下(即,如果您不覆盖该__new__方法)这将返回一个类型为 的空对象Complex

  3. 如果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)


查看完整回答
反对 回复 2022-05-24
?
POPMUISE

TA贡献1765条经验 获得超5个赞

不是某种 to-string 解决方案,类伪装成它不是的东西。

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


查看完整回答
反对 回复 2022-05-24
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

如前所述,new它比其他解决方案容易得多,因为一切都组装在一起。您可以只说如果第二个参数为零,则再次返回aelse 调用__new__

我这可能正是您所需要的,因为您指出您很难找到解决方案。


查看完整回答
反对 回复 2022-05-24
  • 3 回答
  • 0 关注
  • 134 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号