我有一個繼承層次結構,其中一些類有一個名爲例如'pickled'的類屬性。如果存在,我希望得到A.pickled
;如果不存在,我希望得到A.pickled
,即使A來自許多類別,包括例如B和B.pickled
存在(或不存在)。沒有超類屬性的類屬性
現在我的解決方案抓取A
的__mro__
。如果可能,我想要一個更清潔的解決方案
我有一個繼承層次結構,其中一些類有一個名爲例如'pickled'的類屬性。如果存在,我希望得到A.pickled
;如果不存在,我希望得到A.pickled
,即使A來自許多類別,包括例如B和B.pickled
存在(或不存在)。沒有超類屬性的類屬性
現在我的解決方案抓取A
的__mro__
。如果可能,我想要一個更清潔的解決方案
要通過__mro__
繞過正常的搜索,直接在類的屬性查字典來代替。您可以使用該vars()
function:
return vars(cls).get('pickled', None)
你可以只訪問__dict__
屬性直接過:
return cls.__dict__.get('pickled', None)
但使用內置函數優於直接進入雙下劃線的屬性字典。
object.__getattribute__
是用於查看類屬性的錯誤方法;見What is the difference between type.__getattribute__ and object.__getattribute__?
type.__getattribute__
是用於類的屬性訪問,但仍然會搜索MRO。
非常感謝。我們很幸運有你在Stackoverflow上。 –
我不知道,但也許
try:
return object.__getattribute__(cls, 'pickled')
except AttributeError:
return None
你想解決什麼問題? – SingleNegationElimination
@IfLoop我正在使用類屬性來自動pickle特定的屬性。我還使用另一個類屬性自動生成用戶界面,還有更多的類屬性自動生成參數值的歷史記錄。你有更好的解決方案嗎? –