我试图弄清楚如何为插件编写器提供基类,以便它们为几种静态方法提供定义。
插件类是静态方法的集合,永远不会被实例化。
我知道如何使用ABC来防止缺少方法实现的类的实例化,这将无法提供我想要的安全性。是否有防止定义的模式?
答案 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
我的例子相当快速和肮脏,只有经过严格测试,您可能需要对其进行优化以检查各种边缘情况。我所做的是,如果在当前正在定义的类中没有定义抽象方法,则会引发错误。 (否则会引发错误,因为抽象基类没有定义自己的抽象方法的具体实现。)