Supprimer attribut de classe en classe héritée Python
-
01-10-2019 - |
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).
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