web-dev-qa-db-fra.com

python @abstractmethod décorateur

J'ai lu python documents sur les classes de base abstraites:

De ici :

abc.abstractmethod(function) Un décorateur indiquant des méthodes abstraites.

L'utilisation de ce décorateur nécessite que la métaclasse de la classe soit ABCMeta ou en soit dérivée. Une classe qui a une métaclasse dérivée de ABCMeta ne peut pas être instanciée à moins que toutes ses méthodes et propriétés abstraites ne soient remplacées.

Et ici

Vous pouvez appliquer le @abstractmethod décorateur de méthodes telles que draw () qui doivent être implémentées; Python lèvera alors une exception pour les classes qui ne définissent pas la méthode. Notez que l'exception n'est déclenchée que lorsque vous essayez de créer une instance d'une sous-classe sans la méthode.

J'ai utilisé ce code pour tester cela:

import abc

class AbstractClass(object):
  __metaclass__ = abc.ABCMeta

  @abc.abstractmethod
  def abstractMethod(self):
    return

class ConcreteClass(AbstractClass):
  def __init__(self):
    self.me = "me"

c = ConcreteClass()
c.abstractMethod()

Le code va bien, donc je ne comprends pas. Si je tape c.abstractMethod Je reçois:

<bound method ConcreteClass.abstractMethod of <__main__.ConcreteClass object at 0x7f694da1c3d0>>

Qu'est-ce qui me manque ici? ConcreteClass doit implémenter les méthodes abstraites, mais je n'ai aucune exception.

35
Sebastian

Utilisez-vous python3 pour exécuter ce code? si oui, vous devez savoir que déclarer la métaclasse dans python 3 avoir des modifications vous devriez le faire comme ceci à la place:

import abc

class AbstractClass(metaclass=abc.ABCMeta):

  @abc.abstractmethod
  def abstractMethod(self):
      return
50
mouad