我正在以下方式使用属性和 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__
函数中产生一个错误,因为我的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)
但这样做感觉很不好。有没有更好的方法来解决这个问题呢?
update_M_inv
就可以了?或者甚至不需要getter,因为我们不需要对属性进行任何预处理? - Sahand@M_inv.setter
装饰器,使 "calculate" 方法与 getter 方法同名但没有参数。这样做不太好看,但函数命名取决于您... - R Yoda