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).

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top