【问题标题】:Calling overridden parent class method in parent class在父类中调用重写的父类方法
【发布时间】:2019-05-18 19:55:27
【问题描述】:

我正在尝试在 ChildClass 中覆盖两个父类函数 traineval。在父类中,eval() 基本上调用了train()。但是,我意识到,当我编写如下代码时,父类中的eval() 试图在ChildClass 中调用函数train() - 我想在父类中使用eval()类改为在父类中调用train()

我只是想知道是否有任何干净的解决方案可以对ChildClass 进行更改,从而允许父类调用父train() 函数?

class ChildClass(nn.Module):
    def __init__(self):
        super(ChildClass, self).__init__()

    def train(self):
        super(ChildClass, self).train()

    def eval(self):
        super(ChildClass, self).eval()

父类位于 Python 包 (pytorch) 中,因此不应进行任何更改:

class Module(object):
    #...

    def train(self, mode=True):
        # ...
        return self

    def eval(self):
        return self.train(False)

【问题讨论】:

  • 如果你想让父类调用父类实现,为什么要在子类中覆盖它?您正在经历的是预期的行为。
  • 1) 我赌 100 美元,你的邮箱是 XY problem。 2)不是真的。在 python 中,所有方法都是“虚拟的”。这就是虚拟方法的工作原理。现在,在 CPython 中,你可以做一些讨厌的事情,比如使用 inspect 检查堆栈帧,并在从父类调用时做一些不同的事情,但这是一个巨大的 hack。
  • 我有一个 ChildClass 对象,我想调用 eval() 和 train() ,这就是我想覆盖这些函数的原因。
  • @matohak 不,这不是真的。您不想只是“调用这些方法”。这不是永远的要求。您想编写一个程序来使用 PyTorch 完成机器学习任务。您假设您必须以这种方式对该类进行子类化,因为这就是您的想法。 你可能错了并且有一个不同的解决方案不需要这个 hack。但为了找到实现最终目标的正确方法,您必须准确解释您想用 PyTorch 做什么。
  • 继承可能不是你想要的。 Module.eval 没有调用任何特定类的 train 方法;它将选择留给self 绑定的任何对象。

标签: python python-3.x pytorch


【解决方案1】:

除了调用父级(至少从您共享的代码中)之外,您的覆盖方法没有做任何事情。

所以,我认为您想要一个与 train()/eval() 具有相同步骤的方法。 我猜你不需要重写 train() 或 eval(),而是在你的子类中添加方法并以你想要混合它们的任何顺序调用父 train()/eval()。

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多