问题:
我想生成一个抽象类,其中包含一些应该由其子类实现的方法存根,从而避免任何硬编码。
也就是说,如果我按如下方式定义一个类:
>>> class Sample(SomeClass):
... ACTIONS = ('run', 'sleep', 'kill')
上述课程应始终实施方法run
,sleep
和kill
。
尝试解决方案:
下面的代码段按预期工作,并在子类run
中未定义抽象方法FooBar
时引发错误。
>>> class Foo(object):
... __metaclass__ = ABCMeta
...
... @abstractmethod
... def run(self, *args, **kwargs):
... pass
>>> class FooBar(Foo):
... def __init__(self, a, b):
... self.a = a
... self.b = b
>>> FooBar(1, 2)
TypeError: Can't instantiate abstract class FooBar with abstract methods run
我试图通过使用Foo
生成type
类来实现相同目标:
>>> Foo2 = type('Foo', (), {'__metaclass__': ABCMeta,
... 'run' : abstractmethod(lambda self, *args, **kwargs: None)})
>>> class FooBar(Foo2):
... def __init__(self, a, b):
... self.a = a
... self.b = b
但是,以下调用不会引发任何错误:
>>> FooBar(1, 2)
<__main__.FooBar at ...>
注意到__abstractmethods__
中未定义Foo2
(比较vars(Foo)
和vars(Foo2)
)。
我确实发现了类似的尝试here,但无法理解上述原因无法解决的原因以及为什么我无法直接使用ABCMeta
(定义{{1}以通用的方式)。
答案 0 :(得分:0)
意识到我可以这样做:)
>>> Foo2 = ABCMeta('Foo', (), {'run': abstractmethod(lambda self, *args, **kwargs: None)})
>>> FooBar(1, 2)
TypeError: Can't instantiate abstract class FooBar with abstract methods run