【问题标题】:Python setter without argument?没有参数的Python setter?
【发布时间】:2019-06-03 05:34:24
【问题描述】:

我正在以下方式使用属性和设置器装饰器:

class PCAModel(object):
    def __init__(self):
        self.M_inv = None

    @property
    def M_inv(self):
        return self.__M_inv

    @M_inv.setter
    def set_M_inv(self):
        M = self.var * np.eye(self.W.shape[1]) + np.matmul(self.W.T, self.W)
        self.__M_inv = np.linalg.inv(M)

这会在 __init__ 函数中产生错误,因为我的 setter 没有接受参数:

TypeError: M_inv() takes 1 positional argument but 2 were given

我不想用参数设置M_inv,因为M_inv 的计算仅依赖于类对象的其他属性。我可以在 setter 中放置一个虚拟参数:

@M_inv.setter
def set_M_inv(self, foo):
    M = self.var * np.eye(self.W.shape[1]) + np.matmul(self.W.T, self.W)
    self.__M_inv = np.linalg.inv(M)

但这感觉很脏。有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: python properties setter


    【解决方案1】:

    您忽略了 setter 和 getter 的意义,尽管名称非常不言自明。如果您的参数是独立于您尝试 set 计算的(您想省略 setter 中的参数),那么根本不需要 setter。由于您要做的就是为每个实例计算此参数,因此只需计算并返回 getter 中的值,因此每次尝试访问参数时,您都将获取正确的新计算值.

        @property
        def M_inv(self):
            M = self.var * np.eye(self.W.shape[1]) + np.matmul(self.W.T, self.W)
            return np.linalg.inv(M)
    

    【讨论】:

    • 谢谢。问题是我希望能够有一个获取当前值的getter,然后有一个单独更新值的函数。这样我可以在更新 M_inv 并获得“新”值之前获得“旧”值。也许只是有一个吸气剂,然后有一个简单的函数update_M_inv是要走的路吗?或者甚至不需要 getter,因为我们不需要对属性进行任何预处理?
    • 在这种情况下,我认为您使用更新功能的方法是以符合面向对象的方式解决您的问题的最佳方法!
    • @Sahand 为什么不直接删除 @M_inv.setter 装饰器以使“计算”方法与 getter 方法同名但没有参数。不好,但函数命名取决于你......
    猜你喜欢
    • 2014-06-10
    • 2014-11-12
    • 1970-01-01
    • 2021-02-06
    • 2020-06-04
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多