Est-il possible de faire abstraction de classes en Python?
Comment puis-je faire une classe ou une méthode abstraite en Python?
J'ai essayé de redéfinir __new__()
comme suit:
class F:
def __new__(cls):
raise Exception("Unable to create an instance of abstract class %s" %cls)
mais maintenant, si je créer une classe G
qui hérite de F
comme suit:
class G(F):
pass
alors je ne peux pas instancier G
, car il appelle sa de la classe super __new__
méthode.
Est-il un meilleur moyen de définir une classe abstraite?
Vous devez vous connecter pour publier un commentaire.
Utiliser le
abc
module pour créer des classes abstraites. Utiliser leabstractmethod
décorateur à déclarer une méthode abstraite, et de déclarer une classe abstraite à l'aide de l'une des trois façons, en fonction de votre version de Python.En Python 3.4 et au-dessus, vous pouvez hériter de
ABC
. Dans les précédentes versions de Python, vous devez spécifier la classe de la métaclasse commeABCMeta
. La spécification de la métaclasse a une syntaxe différente en Python 3 et Python 2. Les trois possibilités sont illustrées ci-dessous:Selon la façon dont vous l'utilisez, vous ne serez pas en mesure d'instancier une classe abstraite qui a des méthodes abstraites, mais sera en mesure d'instancier une sous-classe qui offre des définitions de ces méthodes:
@abstractmethod
fait en sorte que le décoré de la fonction doit être substituée à l'avant de la classe peut être instancié. À partir de la documentation:A class that has a metaclass derived from ABCMeta cannot be instantiated unless all of its abstract methods and properties are overridden.
@abstractmethod
pour__init__
méthode, voir stackoverflow.com/q/44800659/547270La vieille école (pré-PEP 3119) façon de le faire c'est juste pour
raise NotImplementedError
dans la classe abstraite lorsqu'une méthode abstraite est appelé.Ce n'ont pas les mêmes propriétés que l'utilisation de la
abc
module. Vous pouvez toujours instancier la classe de base abstraite elle-même, et vous ne trouverez pas de votre faute, jusqu'à ce que vous appelez la méthode abstraite au moment de l'exécution.Mais si vous avez affaire à un petit ensemble de simples classes, peut-être avec juste quelques méthodes abstraites, cette approche est un peu plus facile que d'essayer de passer à travers les
abc
de la documentation.Voici une façon très simple sans avoir à traiter avec le module ABC.
Dans le
__init__
méthode de la classe que vous voulez être une classe abstraite, vous pouvez cocher la case "type" de l'auto. Si le type de l'auto est la classe de base, alors le visiteur tente d'instancier la classe de base, afin de lever une exception. Voici un exemple simple:Lorsque vous exécutez, il produit:
Cela montre que vous pouvez créer une instance d'une sous-classe qui hérite d'une classe de base, mais vous ne peut pas instancier la classe de base directement.
Irv
Ce travail en python 3
La plupart des Précédentes réponses étaient correctes mais voici la réponse et un exemple pour Python 3.7. Oui, vous pouvez créer une classe abstraite et de la méthode. Juste pour rappel, parfois, une classe doit définir une méthode qui appartient logiquement à une classe, mais la classe ne peut pas spécifier la façon de mettre en œuvre la méthode. Par exemple, dans le des Parents et des Bébés classes ils ont tous les deux manger, mais la mise en œuvre sera différente pour chacun parce que les bébés et les parents mangent un autre type de nourriture et le nombre de fois ils mangent est différent. Alors, mangez de la méthode de sous-classes substitue AbstractClass.manger.
De SORTIE:
import abc
est inutile.Oui, vous pouvez créer des classes abstraites en python avec l'abc (classes de base abstraites) du module.
Ce site va vous aider avec elle: http://docs.python.org/2/library/abc.html
aussi ce qui fonctionne et est simple:
Vous pouvez également exploiter le __new__ méthode à votre avantage. Vous avez juste oublié quelque chose.
L' __new__ méthode renvoie toujours le nouvel objet de sorte que vous devez retourner sa super-classe " nouvelle méthode. Procédez comme suit.
Lors de l'utilisation de la nouvelle méthode, vous devez retourner l'objet, pas le Aucun mot-clé. C'est tout ce que vous avez manqué.
Dans votre extrait de code, vous pouvez également résoudre ce problème en fournissant une implémentation pour la
__new__
méthode dans la sous-classe, de la même manière:Mais c'est un hack et je vous le déconseille, sauf si vous savez ce que vous faites. Pour presque tous les cas, je vous conseille d'utiliser le
abc
module, que d'autres avant moi l'ont suggéré.Également lorsque vous créez un nouveau (de base) de la classe, faire sous-classe
object
, comme ceci:class MyBaseClass(object):
. Je ne sais pas si c'est beaucoup plus importante, mais il permet de conserver le style de la cohérence dans votre codeJuste un petit plus pour @TimGilbert est de la vieille école de réponse...vous pouvez faire de votre classe de base abstraite de init() la méthode lève une exception et qui l'empêcherait d'être instancié, non?