【问题标题】:How can I avoid code repetition when overriding many properties in a child class in the same way?以相同方式覆盖子类中的许多属性时,如何避免代码重复?
【发布时间】:2022-07-25 17:51:52
【问题描述】:

我有一个类,其中有返回数组的属性。为简单起见,我们将它们视为常量:

import numpy as np

class MyClass:
    def __init__(self):
        self._time = np.array([0, 1, 2, 3])
        self._a = np.array([0, 1, 2, 3])
        self._b = np.array([4, 5, 6, 7])

    @property
    def a(self):
        return self._a

    @property
    def b(self):
        return self._b

现在,我有另一个继承 MyClass 的类,它正在插入数据,例如:

class Interpolator(MyClass):
    def __init__(self, vector):
        super().__init__()
        self._vector = np.array(vector)

    @property
    def a(self):
        return np.interp(self._vector, self._time, self._a)

    @property
    def b(self):
        return np.interp(self._vector, self._time, self._b)

现在,问题是我有 2 个类,例如 MyClass,每个类都包含约 30 个属性。

有没有一种方法可以覆盖所有方法而无需一一进行?我也在查看this solution,但我不确定是否/如何将其应用于我的问题。

【问题讨论】:

  • @MoRe 人体工程学,例如代码完成,例如。通过显式 propertys,您的 IDE 可以告诉您实际存在哪些属性。
  • 这真的是一种反模式
  • 这里不要使用attributes这个词——使用methods这个词
  • 这里不要使用attributes这个词——使用methods这个词

标签: python overriding


【解决方案1】:

通过您可以在子类中覆盖的函数将您的超类重构为“代理”/“蹦床”这些属性:

import numpy as np


class MyClass:
    def __init__(self):
        self._time = np.array([0, 1, 2, 3])
        self._a = np.array([0, 1, 2, 3])
        self._b = np.array([4, 5, 6, 7])

    def _get_property(self, v):
        return v

    @property
    def a(self):
        return self._get_property(self._a)

    @property
    def b(self):
        return self._get_property(self._b)


class Interpolator(MyClass):
    def __init__(self, vector):
        super().__init__()
        self._vector = np.array(vector)

    def _get_property(self, v):
        return np.interp(self._vector, self._time, v)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2019-10-11
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多