生成抽象基类Python

时间:2018-04-26 06:16:48

标签: python abstract-class

问题:

我想生成一个抽象类,其中包含一些应该由其子类实现的方法存根,从而避免任何硬编码。

也就是说,如果我按如下方式定义一个类:

>>> class Sample(SomeClass):    
...    ACTIONS = ('run', 'sleep', 'kill')

上述课程应始终实施方法runsleepkill

尝试解决方案:

下面的代码段按预期工作,并在子类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}以通用的方式)。

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