我正在通过以下方式使用属性和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)
但是感觉很脏。有更好的方法解决这个问题吗?
答案 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)