Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
没有参数的Python setter?_Python_Properties_Setter - Fatal编程技术网

没有参数的Python setter?

没有参数的Python setter?,python,properties,setter,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])

我以以下方式使用属性和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)
这会在
\uuuu init\uuuu
函数中生成错误,因为我的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)

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

你忽略了setter和getter的要点,尽管它们的名字是不言自明的。如果您的参数是独立于您试图设置的参数计算的(您希望在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和获取“新”值之前获取“旧”值。也许只是有一个getter,然后有一个简单的函数
update\M\u inv
就是一种方法?或者甚至不需要getter,因为我们不需要对属性进行任何预处理?在这种情况下,我认为使用更新函数是以面向对象的方式解决问题的最佳方法@为什么不直接删除
@M_inv.setter
装饰器,使“calculate”方法与getter方法同名,但不带参数呢。不太好,但函数命名取决于您。。。