2011-01-27 7 views
12

nie mogę uruchomić tego kodu, ponieważ otrzymuję wyjątek:abstractmethod nie jest zdefiniowana

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

Jestem pewien, że kod jest w porządku, bo mam go od http://docs.python.org/library/abc.html

EDIT

Dziękujemy za odpowiedź, działa teraz, ale dlaczego

print '__subclasshook__' 

to nie działa? Nie rozumiem w Debug I/0

+0

Dlaczego 'print 'Jestem w __subclasshook __'' nie działa? Czy rzeczywiście poświęciłeś czas na policzenie znaków cudzysłowu '' '? –

+0

Przepraszam, w rzeczywistości jest "__subclasshook__". Napisałem tutaj inny tekst do jasności: / – user278618

Odpowiedz

23

Wystarczy tylko importowane ABCMeta

from abc import ABCMeta 

również importować abstractmethod

from abc import ABCMeta, abstractmethod 

i wszystko powinno być w porządku.

2

Należy zaimportować abstractmethod z abc.