在父类中调用被覆盖的父类方法

5
我正在尝试在一个名为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)

如果你想让父类调用父类的train实现,为什么要在子类中重写它?你所经历的是预期的行为。 - mehdix
  1. 我打赌100美元,你的问题是一个XY问题
  2. 不完全是这样。在Python中,所有方法都是“虚拟的”。这就是虚拟方法的工作原理。现在,在CPython中,您可以使用inspect检查堆栈帧,并在从父类调用时执行不同的操作,但这是一个巨大的hack。
- Giacomo Alzetta
我有一个ChildClass对象,我想调用eval()和train()函数,因此我想重写这些函数。 - matohak
2
@matohak 不,那不是真的。你不想只是“调用那些方法”。这从来不是一个要求。你想编写一个使用PyTorch实现机器学习任务的程序。你认为必须以那种方式对该类进行子类化,因为这是你的想法。你可能是错的,有一种不需要这种hack的不同解决方案。但是为了找到实现最终目标的正确方法,你将不得不准确地解释你想在PyTorch中做什么。 - Giacomo Alzetta
继承可能不是你想要的。Module.eval 没有调用任何特定类的 train 方法;它将这个选择留给了 self 绑定到的任何对象。 - chepner
1个回答

0

根据你分享的代码,你重写的方法除了调用父类方法之外,并没有执行其他任务。

所以我认为你想要一个和train()/eval()步骤相同的方法。我猜你不需要重写train()或者eval()方法,相反,在你的子类中添加方法并按照你想要的顺序调用父级的train()/eval()即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接