【发布时间】:2019-05-18 19:55:27
【问题描述】:
我正在尝试在 ChildClass 中覆盖两个父类函数 train 和 eval。在父类中,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