2014-06-10 142 views
1

我有一個繼承層次結構,其中一些類有一個名爲例如'pickled'的類屬性。如果存在,我希望得到A.pickled;如果不存在,我希望得到A.pickled,即使A來自許多類別,包括例如B和B.pickled存在(或不存在)。沒有超類屬性的類屬性

現在我的解決方案抓取A__mro__。如果可能,我想要一個更清潔的解決方案

+0

你想解決什麼問題? – SingleNegationElimination

+0

@IfLoop我正在使用類屬性來自動pickle特定的屬性。我還使用另一個類屬性自動生成用戶界面,還有更多的類屬性自動生成參數值的歷史記錄。你有更好的解決方案嗎? –

回答

2

要通過__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。

+1

非常感謝。我們很幸運有你在Stackoverflow上。 –

0

我不知道,但也許

try: 
    return object.__getattribute__(cls, 'pickled') 
except AttributeError: 
    return None 
相關問題