我想确保从我的类派生的任何类都覆盖某些方法。如果它们没有被覆盖,我想在编译开始后尽快引发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派生的类覆盖,则会在类定义时引发错误。
有更好的方法吗?
答案 0 :(得分:0)
为什么不使用abstractmethod。
from abc import abstractmethod, ABCMeta
class BaseClass(object):
__metaclass__ = ABCMeta
@abstractmethod
def method_a(self):
pass
@abstractmethod
def method_b(self):
pass
class Inherit(BaseClass):
pass
一旦用户尝试实例化Inherit类,您就会收到错误。
i = Inherit()
TypeError: Can't instantiate abstract class Inherit with abstract methods method_a, method_b