Python сеттер без аргументов? - PullRequest
0 голосов
/ 08 января 2019

Я использую декораторы свойств и сеттеров следующим образом:

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 голосов
/ 08 января 2019

Вам не хватает точки сеттеров и геттеров, хотя названия довольно очевидны. Если ваш параметр рассчитывается независимо от того, что вы пытаетесь установить (вы хотите пропустить аргумент в установщике), тогда установщик просто не нужен вообще. Поскольку все, что вам нужно, - это рассчитать этот параметр для каждого экземпляра, просто рассчитайте и верните значение в получателе, так что вы будете получать правильное, только что вычисленное значение при каждой попытке доступа к вашему параметру.

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