Кажется, что когда у меня есть абстрактный базовый класс, который наследуется от gevent.Greenlet (который наследуется от окуляра модуля расширения C: https://github.com/python-greenlet/greenlet), то классы, которые его реализуют, не поднимают никаких ошибок abc о нереализованных методах.Могут ли абстрактные базовые классы python наследовать от C-расширений?
class ActorBase(gevent.Greenlet):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def foo(self):
print "foo"
class ActorBaseTest(ActorBase):
def bar(self):
print "bar"
abt = ActorBaseTest() # no errors!
Если я наследовать от object
он не как ожидалось:
class ActorBase(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
def foo(self):
print "foo"
class ActorBaseTest(ActorBase):
def bar(self):
print "bar"
>>> abt = ActorBaseTest()
Traceback (most recent call last):
File "/home/dw/.virtualenvs/prj/local/lib/python2.7/site-packages/IPython/core/interactiveshell.py", line 2827, in run_code
exec code_obj in self.user_global_ns, self.user_ns
File "<ipython-input-6-d67a142e7297>", line 1, in <module>
abt = ActorBaseTest()
TypeError: Can't instantiate abstract class ActorBaseTest with abstract methods foo
Что такое правильный способ реализации этой функции?
В целом, все должно быть в порядке. Однако 'gevent.Greenlet' не может быть классом нового стиля, который может помешать работе с машиной ABC. – chepner
К сожалению, вы правы. gevent.Greenlet наследуется от модуля расширения C.Я отредактирую вопрос, чтобы спросить, какой хороший способ реализовать этот вариант использования. –
Наследование от типа, реализованного на C, не должно быть проблемой, в общем. Должно быть что-то специфическое для самого класса greenlet.greenlet, который мешает. –