【问题标题】:Ensure a Method is Overridden确保方法被覆盖
【发布时间】: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_amethod_b 未被从 BaseClass 派生的类覆盖,这将在类定义时引发错误。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 仅供参考,这不是编译时间,而是类定义时间,通常是模块导入时间。但是一个类也可以有条件地定义(所以这个测试也不会运行)或动态地定义,例如在应用程序运行期间随时调用的内部函数。
  • @delnan 谢谢我想我的意思是我想尽快提出错误。我会修正我的措辞。

标签: python overriding metaclass


【解决方案1】:

为什么不使用抽象方法。

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

【讨论】:

  • 感谢您的回答。我不知道abstractmethod。但似乎我的方法比这更快地引发了错误。我真的想尽可能多地节省调试时间。
  • 我认为一个简单的if __name__== "__main__" Inherit() etc.. 会做同样的事情。
猜你喜欢
  • 2013-12-24
  • 2014-01-05
  • 2011-12-13
  • 2012-09-22
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
相关资源
最近更新 更多