如何在Python中使用抽象基类?

时间:2014-03-12 13:17:56

标签: python abstract-class abc

关注this tutorial我试图在Python中使用抽象基类。所以我构建了两个文件:

basis.py

import abc

class PluginBase(object):
    __metaclass__ = abc.ABCMeta

    @abc.abstractmethod
    def load(self, input):
        return

implementation.py

import abc
from basis import PluginBase

class SubclassImplementation(PluginBase):

    def load(self, input):
        print input
        return input

if __name__ == '__main__':
    print 'Subclass:', issubclass(SubclassImplementation, PluginBase)
    print 'Instance:', isinstance(SubclassImplementation(), PluginBase)

运行python implementation.py工作正常,但我现在想要将implementation.py用作其他内容的模块。所以我进入命令行并执行:

>>> from implementation import SubclassImplementation as imp
>>> imp.load('lala')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method load() must be called with SubclassImplementation instance as first argument (got str instance instead)
>>>

我在这里做错了什么,我怎样才能做到这一点?欢迎所有提示!

2 个答案:

答案 0 :(得分:3)

您需要创建实例

from implementation import SubclassImplementation as imp

imp().load('lala')

这也不是特定的ABC问题;这适用于所有Python类和方法,除非您将SubclassImplementation.load设为classmethod

答案 1 :(得分:3)

这与ABCs没有任何关系。

您称之为imp的对象是一个类,即SubclassImplementation。在调用任何实例方法之前,您需要实例化它。或者,您可以将load作为一种类方法。