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

0 投票
2 回答
563 浏览
提问于 2025-04-17 21:56

根据这个教程,我想在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 个回答

3

这和字母ABC没有关系。

你提到的这个对象imp其实是一个类,也就是SubclassImplementation。在你能调用它的实例方法之前,你需要先创建这个类的一个实例。或者,你也可以把load改成一个类方法,这样就不需要实例化了。

3

你确实需要创建一个实例

from implementation import SubclassImplementation as imp

imp().load('lala')

这并不是一个特定的ABC问题;这适用于所有的Python类和方法,除非你把SubclassImplementation.load定义为一个classmethod

撰写回答