用 super() 覆盖 属性

Override a property with super()

我想覆盖此 parent 属性 以使其成为有条件的标志:

@property
def velocity(self):
    """Instantaneous velocity in km/h."""
    if self.time is not None:
        dt = np.diff(self.seconds)
        dd = np.diff(self.distance)
        vs = 3600 * dd / dt
        return self._resample(vs, self.seconds)
    else:
        return None

我可以在 child:

中用类似的东西轻松做到这一点
@property
def velocity(self, flag=True):
    if flag:
        if self.time is not None:
            dt = np.diff(self.seconds)
            dd = np.diff(self.distance)
            vs = 3600 * dd / dt
            return self._resample(vs, self.seconds)
        else:
            return None

但是我不应该也可以这样做而不是复制代码 vebatim 吗?如果我这样做,“supered”函数总是 returns None,无论标志还是 self.time 都没有改变(并且不是 None):

@property
def velocity(self, flag=True):
    if flag:
        super().velocity

尝试return super().velocity

@property
def velocity(self, flag=True):
    if flag:
        return super().velocity

使用 @decorator 的要点是您可以将方法调用为 obj.velocity。没有括号,没有参数。现在 obj.velocity returns 某些东西(数据框?)obj.velocity(False) 将尝试 调用 带有参数 False 的数据框。这会失败..

你可以使 flag 成为一个 class 变量:

class SomeClass:
    FLAG = False

    @property
    def velocity(self):
        if SomeClass.FLAG:
            return super().velocity

并且如前所述:您需要 return 方法中的值。