没有实例的类 - 更多pythonic方式?

时间:2018-04-25 14:19:04

标签: python python-3.x oop

我有一个应用程序,其中(更大的一组)开发人员添加命令。这些命令由一组函数组成,主要是'handle()'来实际执行操作和描述性属性,以帮助解析器找到正确的函数。 为了强制执行命令的某些标准,我们有一个所有命令都需要派生的基类。

我的问题是这些实际上并没有用作类,从来没有任何命令的实例。

class command(ABC):
    '''
    class all commands inherit from
    '''

    @property
    @staticmethod
    @abstractmethod
    def name():
        '''
        returns the name of the command (which the parser acts on)
        '''
        pass

    @property
    @staticmethod
    @abstractmethod
    def help():
        '''
        returns the help text
        '''
        pass

    @property
    @staticmethod
    @abstractmethod
    def handle():
        '''
        contains the actual command handler, may return data
        '''
        pass

class commandPrint(command):
    '''
    example
    '''

    @staticmethod
    def name():
        return 'print'

    @staticmethod
    def help():
        return 'Print some string'

    @staticmethod
    def handle(inputString):
        print(inputString)
        return inputString

这很好用,但似乎有点'unpythonic',因为我们从未创建过这些命令的实例。虽然这确实给了一个框架,但是abc的目的没有用 - 我们从不创建实例,所以我们永远不会看到缺少抽象方法。

是否有更加pythonic的方式来存档这种类型的接口?

1 个答案:

答案 0 :(得分:-1)

如果要显式阻止此类实例化(抽象),可以使用:

class Command():
    def __init__(self):
        raise NotImplementedError()

您还可以在基类的所有方法中而不是NotImplementedError中引发此错误pass,使其更像是一个接口(需要重新定义所有方法)。