2010-09-09 14 views
5

consideri tale codice:Rimuovi attributo di classe in classe ereditata Python

class A(): 
    name = 7 
    description = 8 
    color = 9 

class B(A): 
    pass 

Classe B ha ora (eredita) tutti gli attributi di classe A. Per qualche motivo che voglio B non ereditare attributo 'colore'. C'è una possibilità per fare questo?
Sì, lo so, posso prima creare la classe B con gli attributi 'nome' e 'descrizione' e quindi ereditare la classe A da B aggiungendo l'attributo 'colore'. Ma nel mio caso esatto, B è in realtà una versione ridotta di di A, quindi per me sembra più logico rimuovere l'attributo in B (se possibile).

+3

Se B è una versione ridotta di A, perché non estendere A B invece che il contrario il giro? –

risposta

8

Penso che la soluzione migliore sarebbe quella di change your class hierarchy modo da poter ottenere le classi che si desidera senza trucchi di fantasia.

Tuttavia, se si dispone di una buona ragione per non farlo, è possibile nascondere l'attributo colorusing a Descriptor. È necessario utilizzare nuove classi di stile affinché funzioni.

class A(object): 
    name = 7 
    description = 8 
    color = 9 

class Hider(object): 
    def __get__(self,instance,owner): 
     raise AttributeError, "Hidden attribute" 

    def __set__(self, obj, val): 
     raise AttributeError, "Hidden attribute" 

class B(A): 
    color = Hider() 

Avrai quindi ottiene un AttributeError quando si tenta di utilizzare l'attributo color:

>>> B.color 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in __get__ 
AttributeError: Hidden attribute 
>>> instance = B() 
>>> instance.color 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in __get__ 
AttributeError: Hidden attribute 
>>> instance.color = 3 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 6, in __set__ 
AttributeError: Hidden attribute 
+0

Hai ragione, dovrei cambiare la mia gerarchia di classi. – Graf

+0

@Graf - Cambiare la gerarchia delle classi era nella risposta di @ Duncan per prima - ho appena collegato ad esso - quindi penso che dovresti accettare la sua risposta davvero. –

7

È possibile fornire un valore diverso per color in B, ma se si desidera che B non abbia una proprietà di A, esiste un solo modo pulito per farlo: creare una nuova classe base.

class Base(): 
    name = 7 
    description = 8 

class A(Base): 
    color = 9 

class B(Base): 
    pass 
Problemi correlati