没有参数的Python setter?

时间:2019-01-08 13:50:49

标签: python properties setter

我正在通过以下方式使用属性和setter装饰器:

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__函数中产生错误,因为我的设置者未接受参数:

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

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

@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)

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

1 个答案:

答案 0 :(得分:2)

尽管名称很不言自明,但您缺少设置员和获取者的要点。如果您的参数是独立于要尝试设置的参数计算的(您想忽略设置器中的参数),则根本不需要设置器。由于您要做的只是为每个实例计算此参数,因此只需在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)