2015-06-19 62 views
9

我需要能夠設置一個而不是對一個類的實例)的標誌,這是不可見的子類。問題是,這有可能嗎?如果是這樣,我該怎麼做?如何將屬性添加到_not_繼承的python * class *?

爲了說明,我想是這樣的:

class Master(SomeOtherClass): 
    __flag__ = True 

class Child(Master): 
    pass 

...其中hasattr(Master, "__flag__")應該Child返回TrueMasterFalse。這可能嗎?如果是這樣,怎麼樣?我不想在每個孩子中明確地設置__flag__爲假。

我最初的想法是定義__metaclass__,但我沒有那麼做,因爲Master繼承自其他一些類和我不控制的元類,哪些是私有類。

最後我想要寫一個裝飾,這樣我可以這樣做:

@hide_this 
class Master(SomeOtherClass): pass 

@hide_this 
class Child(Master): pass 

class GrandChild(Child): pass 
... 
for cls in (Master, Child, GrandChild) 
    if cls.__hidden__: 
     # Master, Child 
    else: 
     # GrandChild 
+1

你可以使它成爲'__hidden',那麼只有它被直接定義的類纔會有'_ClassName__hidden'屬性。 – jonrsharpe

+0

有沒有你不想寫'cls .__ dict __。get('__ hidden __')'的原因,除了它很醜? –

+0

@jonrsharpe:不,不會出現這種解決方案。這將非常有效。寫一個答案,以便我可以接受它,如果你想。如果你不這樣做,我會自己添加答案以供將來參考。謝謝! –

回答

4

你是非常接近:

class Master(SomeOtherClass): 
    __flag = True 

class Child(Master): 
    pass 

兩個前導下劃線不帶尾隨下劃線調用名稱損壞,因此該屬性將被命名爲_Master__flag。因此,如果你檢查:

hasattr(cls, '_{}__flag'.format(cls.__name__)) 

TrueMaster,不Child

+0

這並不是我正在尋找的東西 - 我沒有課堂實例,我只有課堂。雖然這項技術的工作原理是一樣的。 –

+0

@BryanOakley是的,它與類相同;相應更新! – jonrsharpe

+0

非常好。謝謝。我已經在我的代碼中實現了它。 –