Question

Considérez ce code:

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

class B(A):
   pass

Classe B a maintenant (inherits) tous les attributs de la classe A. Pour une raison quelconque, je veux B ne pas attribuer inherit « couleur ». Est-il possible de le faire?
Oui, je sais, que je peux d'abord créer la classe B avec le nom de 'attributs et « description » et Hériter de classe A de B ajoutant attribut « couleur ». Mais dans mon cas précis, B est en fait un réduit version A, donc pour moi, il semble plus logique de supprimer l'attribut dans B (si possible).

Était-ce utile?

La solution

Je pense que la meilleure solution serait de changement votre classe hiérarchie de sorte que vous pouvez obtenir les classes que vous voulez sans tours de fantaisie.

Cependant, si vous avez une très bonne raison de ne pas faire cela, vous pouvez cacher l'attribut color en utilisant un descripteur. Vous aurez besoin d'utiliser les nouvelles classes de style pour que cela fonctionne.

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

Vous obtenez alors un AttributeError lorsque vous essayez d'utiliser l'attribut 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

Autres conseils

Vous pouvez fournir une valeur différente pour color en B, mais si vous voulez B ne pas avoir une propriété de A alors il n'y a qu'une seule façon propre à le faire. Créer une nouvelle classe de base

class Base():
    name = 7
    description = 8

class A(Base):
    color = 9

class B(Base):
    pass
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top