首页 > 解决方案 > 实现特定于类但不直接使用属性的方法的最佳方法

问题描述

我有一个存储数据的类,并允许我在给定一些测量值的情况下对其进行更新。但是,更新步骤并不直接采用原样的属性,而是修改后的版本。我的更新输出也是如此:在将其保存到对象属性之前,我仍然必须对其进行处理。

class Dummy:
    def _prepare_data(self):
        X = self.X
        # Do stuff to X
        return X_prepared
   
    @staticmethod
    def _update(X_prep, measures):
        # Do stuff to X_prep with measures
        return X_updated

    def _store_result(self, X_up):
        # Do stuff to X_up
        self.X = X_up_good_format

    def do_update(self, measures):
        # Method called from the outside, user doesn't care about data prep
        X = self._prepare_data()
        X = self._update(X, measures)
        self._store_results(X)

在这种情况下,我的私有方法_update对类是盲目的,因为我不需要我的类的属性或方法,但我把它作为一个简单的函数放在外面是没有意义的,因为它不“活”单独”,它只存在于这个类中使用。因此,我将该方法作为静态方法(如示例中所示),但我读到这样做是设计不良的标志,因为它违反了 OOP 范式。有一个更好的方法吗?

PS:我宁愿不合并这三个私有方法,因为我希望能够_update独立调用该方法以进行测试。

标签: pythonclassobject

解决方案


我解决您的问题的方法是将_updatewith合并do_update为一个,并将_prepare_dataand_store_result合并为一个property

class Dummy:
    @property
    def X(self):
        X = self._X
        # Do stuff to X
        return X_prepared

    @X.setter
    def X(self, value):
        # Do stuff to value
        self._X = value_good_format

    def do_update(self, measures):
        # Method called from the outside, user doesn't care about data prep
        # Do stuff to self.X with measures
        self.X = X_updated

现在子类可以只覆盖do_update方法,同时仍然依赖于属性提供的转换X


推荐阅读