【问题标题】:Python & Classes - Can I use a method in a superclass that is going to be created in a subclass?Python & Classes - 我可以在超类中使用将在子类中创建的方法吗?
【发布时间】:2020-04-22 04:39:42
【问题描述】:

希望你们一切都好。我需要做一些功课,我提出了一个疑问,我不知道是否可以通过这种方式解决。如果你能帮助我,你介意吗?还是谢谢。

假设我们有这个:

class human:
    def dress(self, weather):
        return color(weather)

class girl(human):
    def color(self, weather):
        if weather == 'rainy':
            print('red')
        else:
            print('blue')

我可以这样做吗?因为乍一看,我有一个问题,即人类的 color() 是未定义的(逻辑上)。你可能会问,你为什么会这样想?因为是解决问题的说明。哪个最好解决?

再次感谢!

【问题讨论】:

  • color 在基类中调用它时可能应该是self.color。在这种情况下,这不是问题。实际上,请查看所谓的“模板方法模式”,这正是需要的。也就是说,作为新用户,请使用tour 并阅读How to Ask

标签: python class object inheritance method-resolution-order


【解决方案1】:

是的,你可以这样做。在超类中拥有由子类定义的方法并不少见。通常,超类将有一个占位符实现,该实现会引发一个异常,指示子类需要定义它——但这并不是它工作所必需的。

class human:
    def dress(self, weather):
        return self.color(weather)

    def color(self, weather):
        raise NotImplementedError("Subclass needs to define this.")

class girl(human):
    def color(self, weather):
        if weather == 'rainy':
            c = 'red'
        else:
            c = 'blue'
        print(c)
        return c

某些基类不能直接使用,需要子类实现基类调用的方法。如果您将此类子类化并填写所需方法的实现.. 基类已经定义的调用它们的方法将起作用。

例如,假设我们有一个女孩实例。我们希望它适合天气。即使子类没有定义dress(),它仍然具有该方法,因为它继承了它。

>>> mary = girl()
>>>
>>> mary.dress("rainy")
red

在运行时,解释器运行dress() 的代码并在其中看到color()。然后它在girl 上查找该函数并找到它。基类是否定义它并不重要。

【讨论】:

  • 感谢托德的快速回答!当我运行该代码时,特别是mary.dress('rainy'),我作为输出NameError: name 'color' is not defined 获得。我是不是跑错了?
  • 啊对.. 你必须使用self 引用来调用对象上的方法。 @fewar
【解决方案2】:

不,除非方法具有相同的名称,否则您不能从父类调用子类方法。 如果您也在父类中创建相同的方法“颜色”,则可以做到这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    相关资源
    最近更新 更多