2011-01-27 23 views
12

no puede ejecutar este código, porque consigo la excepción:abstractmethod no se define

NameError: name 'abstractmethod' is not defined 
File "C:\Tests\trunk\PythonTests\AbstractClasses.py", line 12, in <module> 
    class MyIterable: 
File "C:\Tests\trunk\PythonTests\AbstractClasses.py", line 15, in MyIterable 
    @abstractmethod 

from abc import ABCMeta 

class Foo(object): 
    def __getitem__(self, index): 
     print '__get_item__ Foo' 
    def __len__(self): 
     print '__len__ Foo' 
    def get_iterator(self): 
     print 'get_iterator Foo' 
     return iter(self) 

class MyIterable: 
    __metaclass__ = ABCMeta 

    @abstractmethod 
    def __iter__(self): 
     while False: 
      yield None 

    def get_iterator(self): 
     return self.__iter__() 

    @classmethod 
    def __subclasshook__(cls, C): 
     if cls is MyIterable: 
      if any("__iter__" in B.__dict__ for B in C.__mro__): 
       print "I'm in __subclasshook__" 
       return True 
     return NotImplemented 

MyIterable.register(Foo) 

x=Foo() 
x.__subclasshook__() 

Estoy seguro de que el código está bien, porque yo tengo de http://docs.python.org/library/abc.html

EDITAR

Gracias por la respuesta, funciona ahora, pero ¿por qué

print '__subclasshook__' 

esto no funciona? No entiendo en Depurar I/0

+0

¿Por qué 'print 'estoy en __subclasshook __'' no funciona? ¿De verdad se tomó el tiempo para contar los caracteres de comillas '''? –

+0

lo siento, en realidad hay '__subclasshook__'. Escribí aquí otro texto para clarificar: / – user278618

Respuesta

23

Sólo importado ABCMeta

from abc import ABCMeta 

también importar abstractmethod

from abc import ABCMeta, abstractmethod 

y todo debería estar bien.

2

Necesita importar abstractmethod de abc.

Cuestiones relacionadas