除非实现方法,否则可以阻止类定义吗?

时间:2015-06-16 19:20:45

标签: python plugins abstract-class

我试图弄清楚如何为插件编写器提供基类,以便它们为几种静态方法提供定义。

插件类是静态方法的集合,永远不会被实例化。

我知道如何使用ABC来防止缺少方法实现的类的实例化,这将无法提供我想要的安全性。是否有防止定义的模式

1 个答案:

答案 0 :(得分:1)

你可以通过编写类似于ABCMeta的自己的元类来完成它,它在类定义时检查抽象方法,如果发现任何错误则引发错误。这是一个例子:

class ClassABC(type):
    def __init__(cls, name, bases, attrs):
        abstracts = set()
        for base in bases:
            abstracts.update(getattr(base, '__abstractclassmethods__', set()))
        for abstract in abstracts:
            if getattr(getattr(cls, abstract), '__isabstractmethod__', False):
                raise TypeError("Your class doesn't define {0}".format(abstract))
        for attr in attrs:
            if getattr(attrs[attr], '__isabstractmethod__', False):
                abstracts.add(attr)
        cls.__abstractclassmethods__ = abstracts

class BaseClass(object):
    __metaclass__ = ClassABC

    @abc.abstractmethod
    def foo(self):
        print("I am base foo")

然后:

>>> class Derived(BaseClass):
...     pass
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    class Derived(BaseClass):
  File "<pyshell#8>", line 8, in __init__
    raise TypeError("Your class doesn't define {0}".format(abstract))
TypeError: Your class doesn't define foo

我的例子相当快速和肮脏,只有经过严格测试,您可能需要对其进行优化以检查各种边缘情况。我所做的是,如果在当前正在定义的类中没有定义抽象方法,则会引发错误。 (否则会引发错误,因为抽象基类没有定义自己的抽象方法的具体实现。)