Вместо функций для чтения/записи атрибута можно сделать свойство.
>>> class Person:
...
... _name = None
...
... @property
... def name(self):
... return self._name
...
... @name.setter
... def name(self, s):
... self._name = s
...
>>> p = Person()
>>> p.name = 'name 1'
>>> p.name
'name 1'
>>> p.name = 'name 2'
>>> p.name
'name 2'
>>>
А напрямую к атрибутам обращаться нельзя, потому что они могут быть изменены при редактировании класса, и все коды, которые к ним обращаются, сломаются. То есть либо вот эти методы нужно делать, либо свойство.
AxaRu
Так принято в Python, или это моветон, и нужно обращаться напрямую к значениям?
Не всегда класс и программу, которая его использует, разрабатывает один человек. Поэтому они, не зная друг о друге, могут менять свои коды как угодно.
Даже если сам всё разрабатываешь, код может быть таким большим, что не будет времени его читать, и, внося изменения в какой-то класс, просто не будешь знать, можно их вносить или там что-то зависит.