【发布时间】:2014-07-29 02:49:32
【问题描述】:
我想确保从我的类派生的任何类都会覆盖某些方法。如果它们没有被覆盖,我想在编译开始后尽快引发 NotImplementedError,而不是在调用其中一个方法时。
我发现我可以使用这样的元类来做到这一点:
class MetaBaseClass(type):
# list of method names which should be overridden
to_override = ['method_a', 'method_b']
def __init__(cls, name, bases, dct):
for methodName in cls.to_override:
if methodName not in dct:
raise NotImplementedError('{0} must override the {1} method'.format(name, methodName))
super(MetaBaseClass, cls).__init__(name, bases, dct)
class BaseClass(object):
__metaclass__ = MetaBaseClass
def method_a(self):
pass
def method_b(self):
pass
如果 method_a 或 method_b 未被从 BaseClass 派生的类覆盖,这将在类定义时引发错误。
有没有更好的方法来做到这一点?
【问题讨论】:
-
仅供参考,这不是编译时间,而是类定义时间,通常是模块导入时间。但是一个类也可以有条件地定义(所以这个测试也不会运行)或动态地定义,例如在应用程序运行期间随时调用的内部函数。
-
@delnan 谢谢我想我的意思是我想尽快提出错误。我会修正我的措辞。
标签: python overriding metaclass