Rimuovere attributo di classe in classe ereditata Python
-
01-10-2019 - |
Domanda
Si consideri tale codice:
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 ragione voglio B non 'colore' ereditare attributo. C'è una possibilità per fare questo?
Sì, lo so, che posso creare prima classe B con gli attributi 'nome' e 'descrizione' e la classe poi ereditare un attributo da B l'aggiunta di 'colore'. Ma nel mio caso esatto, B è in realtà un ridotto la versione di A, quindi per me sembra più logico per rimuovere l'attributo in B (se possibile).
Soluzione
Credo che la soluzione migliore sarebbe quella di tua classe gerarchia modo da poter ottenere le classi che si desidera senza trucchi di fantasia.
Tuttavia, se si dispone di una buona ragione per non fare questo si potrebbe nascondere l'attributo color
utilizzando un descrittore. dovrete essere utilizzare nuove classi di stile per questo al lavoro.
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()
Potrai 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
Altri suggerimenti
Si può fornire un valore diverso per color
in B, ma se si vuole B non avere alcune proprietà di A, allora c'è solo un modo pulito per farlo:. Creare una nuova classe di base
class Base():
name = 7
description = 8
class A(Base):
color = 9
class B(Base):
pass