self._foo
и self.foo
будут отличаться, за исключением того, что вы присвоите созданному свойству имя foo
: foo = property(_get_foo, _set_foo)
.
Итак, теперь у вас есть два определенных имени foo
, которое является свойством, которое определяется в терминах методов _set_foo
и _get_foo
. У вас также определено имя _foo
, но это тот же атрибут, который используется в _set_foo
и _get_foo
и, следовательно, в свойстве foo
.
То есть вы два имени, но только один объект.
foo
/\
/ \
_set_foo _get_foo
\ /
\ /
_foo --> object
Примечание: Для примера, в котором у вас есть Python, это излишне, нет необходимости использовать методы getter и setter, если в них не будет бизнес-логики. атрибут с именем foo
, вы всегда можете обернуть его в свойстве в будущем, не влияя на клиентский код, если выяснится, что вам нужны какие-то смарты для доступа к атрибуту.
Измените свой код на:
class ClassName(object):
def __init__(self, foo, bar):
self.foo = foo # read-write property
self.bar = bar # simple attribute
И foo
, и bar
доступны для чтения и записи, если вам нужен более точный контроль, вы можете рассмотреть возможность использования свойства.