47 votes

Python : supprimer un attribut de classe dans une sous-classe

J'ai une sous-classe et je veux qu'elle n'inclue pas d' attribut de classe présent sur la classe de base.

J'ai essayé ceci, mais cela ne fonctionne pas :

 >>> class A(object):
...     x = 5
>>> class B(A):
...     del x
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    class B(A):
  File "<pyshell#1>", line 2, in B
    del x
NameError: name 'x' is not defined

Comment puis-je faire ceci?

57voto

Bhushan Points 192

Vous pouvez utiliser delattr(class, field_name) pour le supprimer de la définition de classe.

20voto

Keith Points 13800

Vous n'avez pas besoin de le supprimer. Il suffit de le remplacer.

 class B(A):
   x = None

ou tout simplement ne pas y faire référence.

Ou envisagez une conception différente (attribut d'instance ?).

8voto

JBernardo Points 14772

Peut-être que vous pourriez définir x comme property et augmenter AttributeError chaque fois que quelqu'un essaie d'y accéder.

 >>> class C:
        x = 5

>>> class D(C):
        def foo(self):
             raise AttributeError
        x = property(foo)

>>> d = D()
>>> print(d.x)
File "<pyshell#17>", line 3, in foo
raise AttributeError
AttributeError

8voto

katrielalex Points 40655

Réfléchissez bien aux raisons pour lesquelles vous voulez faire cela ; vous ne le faites probablement pas. Envisagez de ne pas faire hériter de B de A.

L'idée du sous-classement est de spécialiser un objet. En particulier, les enfants d'une classe doivent être des instances valides de la classe parent :

 >>> class foo(dict): pass
>>> isinstance(foo(), dict)
... True

Si vous implémentez ce comportement (avec par exemple x = property(lambda: AttributeError) ), vous brisez le concept de sous-classement, et c'est mauvais.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X