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

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

Python:當有 __slots__ 時如何編寫 __repr__

Python:當有 __slots__ 時如何編寫 __repr__

慕雪6442864 2023-07-18 16:37:22
我想知道如何__repr__使用__slots__. 據我了解__repr__,它應該返回一個字符串,該字符串可用于構造我們調用的對象__repr__。換句話說,給予repr(object)Python 解釋器應該構造object.但是,如果有一個類具有__slots__,我很難想象如何實現它。這是因為在使用 時__slots__,槽中的某些屬性可能會被初始化并具有值,而其他屬性可能不會。那么我如何找出哪些屬性已初始化以及將它們傳遞給字符串的值__repr__?此類的最小示例:class TestClass:    __slots__ = 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', '__dict__'    def __init__(self, something, something_else, **kwargs):        self.something = something        self.something_else = something_else        for key, value in kwargs.items():            setattr(self, key, value)    def __repr__(self):        return '%s(%r, %r)' %(self.__class__.__name__, self.something, self.something_else)有什么建議么?
查看完整描述

1 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

據我了解__repr__,它應該返回一個字符串,該字符串可用于構造我們調用的對象__repr__。換句話說,給予repr(object)Python 解釋器應該構造對象。

這只是一個建議,而不是強加:

如果可能的話,這應該看起來像一個有效的 Python 表達式,可用于重新創建具有相同值的對象(給定適當的環境)。如果這是不可能的,則應返回 <...一些有用的描述...> 形式的字符串。

并且“如果可能”的解釋非常松散和弱,許多對象根本不會打擾,例如類或函數的 repr可以產生其源表示,但不要這樣做,因為它幾乎沒有用例并且這會比有用更煩人。

但是,如果有一個類具有__slots__,我很難想象如何實現它。這是因為在使用 時__slots__,槽中的某些屬性可能會被初始化并具有值,而其他屬性可能不會。

當然不是。我從來沒有寫過一個有空位的類,但并不是所有的空位一直都被填滿。Plus hasattr/getattr與插槽配合得很好。

但我不得不問:你是貨物崇拜者嗎__slots__?是否有人曾經告訴您使用插槽,而現在您卻到處使用它們?

slot 是一種內存優化工具,要點是每個成員只需要一個指針(+一些對象開銷),而不是 dict 實例的開銷(及其攤銷重新分配)。當您通常不填充插槽時,使用插槽幾乎沒有任何意義,添加__dict__到插槽中更沒有意義。

更不用說最近的 Python 3 迭代已經為實例字典添加了各種優化,使得槽的用處變得更少,至少隨著屬性數量的增加(在 3.6 的相當大的類上,我們發現差異不到 5%,盡管在小類上它是可能仍然很重要)。


查看完整回答
反對 回復 2023-07-18
  • 1 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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