确保重写方法

时间:2014-06-08 10:56:27

标签: python override metaclass

我想确保从我的类派生的任何类都覆盖某些方法。如果它们没有被覆盖,我想在编译开始后尽快引发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_amethod_b未被从BaseClass派生的类覆盖,则会在类定义时引发错误。

有更好的方法吗?

1 个答案:

答案 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