没有参数的Python setter?
我以以下方式使用属性和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])
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方法同名,但不带参数呢。不太好,但函数命名取决于您。。。