亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在類實例化時返回不同的類型?

在類實例化時返回不同的類型?

慕標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 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號