Вы забыли 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
.В некоторых случаях вы можете использовать один и тот же метод для разных атрибутов, и тогда имеет смысл передать атрибут в качестве параметра, но если это не так, это выглядит просто странно.;)