En C++, vous pouvez désactiver une fonction dans la classe parent en la déclarant privée dans la classe enfant. Comment cela peut-il être fait en Python? C'EST À DIRE. Comment puis-je cacher la fonction du parent de l'interface publique de l'enfant?Héritage Python - comment désactiver une fonction
Répondre
Il n'y a pas vraiment vrai « privé » attributs ou méthodes en Python . Une chose que vous pouvez faire est de remplacer simplement la méthode que vous ne voulez pas dans la sous-classe, et soulever une exception:
>>> class Foo(object):
... def foo(self):
... print 'FOO!'
...
>>> class Bar(Foo):
... def foo(self):
... raise AttributeError("'Bar' object has no attribute 'foo'")
...
>>> b = Bar()
>>> b.foo()
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
File "<interactive input>", line 3, in foo
AttributeError: 'Bar' object has no attribute 'foo'
class X(object):
def some_function(self):
do_some_stuff()
class Y(object):
some_function = None
Cela peut conduire à une mauvaise et difficile à trouver des exceptions étant jetés, donc vous pouvez essayer ceci:
class X(object):
def some_function(self):
do_some_stuff()
class Y(object):
def some_function(self):
raise NotImplementedError("function some_function not implemented")
méthode de Kurosch de résoudre le problème est pas tout à fait correct, parce que vous pouvez toujours utiliser b.foo
sans obtenir un AttributeError
. Si vous n'appelez pas la fonction, aucune erreur ne se produit. Voici deux façons que je peux penser à faire:
import doctest
class Foo(object):
"""
>>> Foo().foo()
foo
"""
def foo(self): print 'foo'
def fu(self): print 'fu'
class Bar(object):
"""
>>> b = Bar()
>>> b.foo()
Traceback (most recent call last):
...
AttributeError
>>> hasattr(b, 'foo')
False
>>> hasattr(b, 'fu')
True
"""
def __init__(self): self._wrapped = Foo()
def __getattr__(self, attr_name):
if attr_name == 'foo': raise AttributeError
return getattr(self._wrapped, attr_name)
class Baz(Foo):
"""
>>> b = Baz()
>>> b.foo() # doctest: +ELLIPSIS
Traceback (most recent call last):
...
AttributeError...
>>> hasattr(b, 'foo')
False
>>> hasattr(b, 'fu')
True
"""
foo = property()
if __name__ == '__main__':
doctest.testmod()
Bar utilise le motif « envelopper » pour restreindre l'accès à l'objet enveloppé. Martelli has a good talk traitant de cela. Baz utilise the property built-in pour implémenter le protocole descripteur pour l'attribut à remplacer.
Eh bien, bien sûr, dans ma réponse, c'est toujours "visible", mais vous ne pouvez pas "l'utiliser" en soi car cela déclenchera l'exception. Un point valable, cependant. – kurosch
+1, quelle astuce pour utiliser une propriété "vide" pour "supprimer" la méthode foo! : D – MestreLion
Cela va casser la classe pour l'utilisation des opérateurs définis sur le parent, car il n'y a pas de sous-classe. De plus, '__getattr__' est lent – JBernardo
C'est la façon la plus propre que je connaisse de le faire. Remplacez les méthodes et demandez à chacune des méthodes surchargées d'appeler votre méthode disabledmethods(). Comme ceci:
class Deck(list):
...
@staticmethod
def disabledmethods():
raise Exception('Function Disabled')
def pop(self): Deck.disabledmethods()
def sort(self): Deck.disabledmethods()
def reverse(self): Deck.disabledmethods()
def __setitem__(self, loc, val): Deck.disabledmethods()
Une variante de la réponse de Kurosch:
class Foo(object):
def foo(self):
print 'FOO!'
class Bar(Foo):
@property
def foo(self):
raise AttributeError("'Bar' object has no attribute 'foo'")
b = Bar()
b.foo
Cela soulève une AttributeError
sur la propriété au lieu du moment où la méthode est appelée.
Je l'aurais suggéré dans un commentaire mais malheureusement je n'en ai pas encore la réputation.
Est-ce que cela augmentera AttributeError si vous appelez 'getattr (b," Foo ")'? Malheureusement, je n'ai pas d'interpréteur Python pour le tester. –
si vous voulez dire 'getattr (b, 'foo')' alors oui ce sera –
Oui, c'est ce que je voulais dire. Bien que 'getattr (b, 'Foo')' vous donnera également une erreur d'attribut, donc pas de soucis là-bas! –
- 1. python héritage attribut class
- 2. Fonction PHP et héritage variable
- 3. Comment désactiver la fonction window.onscroll appelant une autre fonction en javascript?
- 4. Python, rediriger le flux de Popen vers une fonction python
- 5. Python désactiver/rediriger l'entrée au clavier
- 6. Désactiver l'automount de GNOME avec Python
- 7. C# Comment désactiver une touche
- 8. Comment désactiver la fonction Quit dans l'environnement mutilDocument?
- 9. Comment bande décorateurs d'une fonction en python
- 10. MVC modèle/héritage modèle
- 11. héritage java en fonction de la composition (implémentation d'une pile)
- 12. Comment structurer cette interface/héritage
- 13. python: fonction timeit() lente
- 14. Appeler une fonction avec une liste d'arguments en python
- 15. ctypes en python, problème appelant une fonction dans une DLL
- 16. Héritage CGAL
- 17. Impossible de faire une fonction décimale itérables en Python
- 18. Comment désactiver une partie de la page en fonction de l'utilisateur connecté
- 19. Multithreading avec héritage (C++)
- 20. Sortir d'une fonction en Python
- 21. Héritage/Architecture
- 22. Héritage Javascript
- 23. Comment puis-je désactiver une contrainte?
- 24. Comment désactiver RewriteRule pour une sous-catégorie?
- 25. Comment désactiver une sortie de console .DLL?
- 26. comment désactiver tous ListBox sous une forme
- 27. Héritage sérialisable
- 28. HAML Héritage
- 29. héritage virtuel
- 30. Comment faire pour désactiver "periodically_call_remote"
> Il n'y a pas vraiment de véritables attributs ou méthodes "privés" en Python. C'est pourquoi je n'ai pas demandé comment les rendre privés, mais comment les 'enlever' de l'interface. J'espère que la version éditée est plus précise –
Je suis d'accord que NotImplementedError est probablement le meilleur à utiliser, mais si vous vouliez vraiment ne pas avoir la méthode héritée du tout, relancez AttributeError à la place (ce que vous obtiendriez si le parent méthode n'existait pas). –
Bon point concernant AttributeError. Je vais mettre à jour mon exemple. – kurosch