2011-08-25 15 views
17

He leído documentación de Python sobre las clases base abstractas:pitón @abstractmethod decorador

De here:

abc.abstractmethod(function) Un decorador indicando métodos abstractos.

El uso de este decorador requiere que la metaclase de la clase sea ABCMeta o se deriva de ella. No se puede crear una instancia de una clase que tenga una metaclase derivada de ABCMeta a menos que se anulen todos sus métodos abstractos y propiedades .

Y here

se puede aplicar el decorador @abstractmethod a métodos como draw() que debe ser implementada; Python generará una excepción para las clases que no definen el método. Tenga en cuenta que la excepción solo se genera cuando intenta crear una instancia de una subclase que carece del método.

He utilizado este código para probar que fuera:

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() 

El código va bien, así que no lo entiendo. Si escribo c.abstractMethod me sale:

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

Lo que me falta aquí? ConcreteClassdebe implementar los métodos abstractos, pero no me sale ninguna excepción.

+2

Qué Python? Informa el error simplemente bien para mí. Además, siempre puedes subir NotImplementedError en lugar de usar 'abc'. –

+0

Publiqué un comentario sobre la respuesta de mouad, el enlace de 'python' se estableció como predeterminado en' python3'. Tendré en cuenta la excepción, ya que escribir código portátil con los cambios en Python parece estar muy lejos de mi conocimiento de Python. – Sebastian

Respuesta

25

¿Está utilizando python3 para ejecutar ese código? Si es así usted debe saber que declarar metaclase en Python 3 have changes que debe hacerlo de esta manera en su lugar:

import abc 

class AbstractClass(metaclass=abc.ABCMeta): 

    @abc.abstractmethod 
    def abstractMethod(self): 
     return 
+0

Gracias, parece un gran cambio entre las versiones (mi distro apuntaba 'python' a default como' python3'). ¿Cómo escribir eso para compatibilidad con versiones anteriores? Supongo que esta podría ser otra pregunta ... – Sebastian

+1

@Sebastian: 'python3' se diseñó con una menor compatibilidad hacia atrás con su precedente python2 (http://www.python.org/dev/peps/pep-3000/#compatibility-and -transición) pero para resolver las incompatibilidades hacia atrás entre las dos versiones, debe usar el script 2to3.py (http://docs.python.org/library/2to3.html). – mouad

+0

bien, lo probé. Puedo continuar usando la sintaxis '__metaclass__' y usar esa secuencia de comandos para convertirla a la sintaxis' python3'. Simplemente hizo lo que declaraste en el ejemplo. Gracias. – Sebastian