2011-01-27 18 views
12

non posso correre questo codice, perché ho l'eccezione:abstractmethod non è definito

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

Sono sicuro che il codice è ok, perché ho preso da http://docs.python.org/library/abc.html

EDIT

Grazie per la risposta, ora funziona, ma perché

print '__subclasshook__' 

questo non funziona? Non capisco in Debug I/0

+0

Perché 'print 'I'm in __subclasshook __'' non funziona? Hai davvero preso il tempo di contare i caratteri di virgoletta? –

+0

scusa, in realtà c'è "__subclasshook__". Ho scritto qui un altro testo a chiarezza: / – user278618

risposta

23

Hai importato solo ABCMeta

from abc import ABCMeta 

importare anche abstractmethod

from abc import ABCMeta, abstractmethod 

e tutto dovrebbe andare bene.

2

È necessario importare abstractmethod da abc.