【问题标题】:Can I ensure that python base class method is always called我可以确保始终调用 python 基类方法吗
【发布时间】:2017-01-13 21:24:46
【问题描述】:

我有一个python抽象基类如下:

class Node(object):
    """
    All concrete node classes should inherit from this
    """
    __metaclass__ = ABCMeta

    def __init__(self, name):
        self.name = name
        self.inputs = dict()

    def add_input(self, key, value=None, d=None):
        self.inputs[key] = (d, value)

    def bind_input(self):
        print "Binding inputs"

    @abstractmethod
    def run(self):
        pass

现在,各种派生类将从该节点类继承并覆盖run 方法。总是bind_input() 必须是run 方法中应该调用的第一件事。目前,对于所有派生类,开发人员必须确保首先调用self.bind_input()。这本身并不是一个大问题,但出于好奇,是否有可能从基类本身以某种方式确保在执行子对象的run 之前调用bind_input

【问题讨论】:

  • 方法必须是抽象的吗? def run(self): self.bind_input() 然后所有子类都先调用base.run(),比较直观的标准。
  • 是的,因为所有子类都必须具有 run 的类特定实现。

标签: python


【解决方案1】:

通常的面向对象方法是这样的:

def run(self):
    self.bind_input()
    return self.do_run()

@abstractmethod
def do_run(self):
    pass # override this method

让您的子类覆盖内部方法,而不是外部方法。

【讨论】:

  • 我不知道你为什么这么多谈论元类。问题中没有任何内容表明提问者正在考虑编写一个元类来解决这个问题。 (虽然他们使用的是 ABCMeta 元类,但对于抽象基类来说这是强制性的。)
  • 真的!删除了不必要的文本
  • 太棒了。我很惭愧我没有想到这一点。谢谢。
  • 永远不要感到羞耻!下一次,这将是你的第一个方法 =)
猜你喜欢
  • 1970-01-01
  • 2014-04-30
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
相关资源
最近更新 更多