Как и где вычислить производные переменные экземпляра в Python - PullRequest
0 голосов
/ 20 мая 2018

У меня есть класс с переменной экземпляра str.Из этой переменной экземпляра я вычисляю вторую переменную экземпляра, которая в основном представляет собой просто строку, разбитую на определенные «атомы».Вторая переменная экземпляра полностью определяется первой.Я сделал его переменной экземпляра, потому что думаю, что его лучше всего рассматривать как «свойство» класса.Я немного не уверен в том, как обрабатывать производные переменные экземпляра.В частности:

1) Я думаю, что они должны быть только для получения свойств.Однако, поскольку вычисление производной переменной экземпляра является довольно интенсивным, я хочу, чтобы это было сделано при запуске класса, а не при вызове переменной.2) Если я создаю функцию исключительно для вычисления переменной экземпляра, есть ли способ пометить это?3) Кроме того, я должен передать первую переменную экземпляра в качестве параметра или просто прочитать ее в методе из себя?(в общем, я все еще немного не уверен, когда передавать переменные экземпляра в качестве параметров методам.) 4) Есть ли лучший способ сделать это, о котором я не упомянул?Спасибо

РЕДАКТИРОВАТЬ: Вот упрощенный пример того, что я имею в виду:

class Amendment:

    def __init__(self, string):
        self.string = string
        self.atoms = generate_atoms()


    def generate_atoms():
        return do_something_that_takes_long(self.string)

1 Ответ

0 голосов
/ 20 мая 2018

Вы забыли self в нескольких местах.Но вот как сделать свойства .string и .atoms только для получения.Мы используем пару "приватных" атрибутов, созданных во время __init__, и используем @ property для создания реальных получателей.

class Amendment:
    def __init__(self, string):
        self._string = string
        self._atoms = self.generate_atoms()

    def generate_atoms(self):
        #return do_something_that_takes_long(self.string)
        return list(self.string)

    @property
    def string(self):
        return self._string

    @property
    def atoms(self):
        return self._atoms

# Test

a = Amendment('abc')
print(a.string, a.atoms)
# This will raise an error because `.string` is a get-only property.
a.string = 'xyz'

output

abc ['a', 'b', 'c']
Traceback (most recent call last):
  File "./qtest.py", line 53, in <module>
    a.string = 'xyz'
AttributeError: can't set attribute

Если хотите, вы также можете пометить generate_atoms как личное, но, вероятно, в этом нет необходимости.И ничто не мешает настойчивому пользователю в любом случае получить доступ к таким вещам, как объясняют связанные документы.

Что касается вашего третьего вопроса, методы обычно должны обращаться к нужным им атрибутам через self.В некоторых случаях вы можете использовать один и тот же метод для разных атрибутов, и тогда имеет смысл передать атрибут в качестве параметра, но если это не так, это выглядит просто странно.;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...