2015-06-19 6 views
9

Devo essere in grado di impostare un flag su una classe (non su un'istanza di una classe) che non è visibile in una sottoclasse. La domanda è, è possibile, e come lo farei se lo fosse?Come aggiungere un attributo a python * class * che è _not_ ereditato?

Per illustrare, voglio qualcosa di simile:

class Master(SomeOtherClass): 
    __flag__ = True 

class Child(Master): 
    pass 

... dove hasattr(Master, "__flag__") dovrebbe restituire True per Master ma False per Child. È possibile? Se é cosi, come? Non voglio dover impostare in modo esplicito __flag__ su falso in ogni bambino.

Il mio primo pensiero era di definire __metaclass__, ma non ho il lusso di farlo perché Master eredita da alcune altre classi e metaclassi che non controllo e che sono private.

definitiva che sto voler scrivere un decoratore modo che io possa fare qualcosa di simile:

@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

Si potrebbe renderlo '__hidden', quindi solo le classi in cui è stato definito direttamente avrebbero un attributo' _ClassName__hidden'. – jonrsharpe

+0

C'è un motivo per cui non vuoi scrivere 'cls .__ dict __. Get ('__ hidden __')', a parte il fatto che è brutto? –

+0

@jonrsharpe: no, quella soluzione non mi è venuta in mente. Ciò funzionerà in modo fantastico. Scrivi una risposta così posso accettarla se vuoi. Se non lo fai, aggiungerò io stesso la risposta per riferimento futuro. Grazie! –

risposta

4

Eri molto vicino:

class Master(SomeOtherClass): 
    __flag = True 

class Child(Master): 
    pass 

due principali sottolinea senza trailing sottolinea invoca nome mangling, quindi l'attributo sarà denominato _Master__flag. Pertanto se si controlla:

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

sarà solo essere True per Master, non Child.

+0

Non è esattamente quello che sto cercando - Non ho un'istanza della classe, ho solo la classe. La tecnica funziona allo stesso modo, però. –

+0

@BryanOakley sì, è lo stesso con le classi; aggiornato di conseguenza! – jonrsharpe

+0

Eccellente. Grazie. L'ho già implementato nel mio codice. –

Problemi correlati