Форум сайта python.su
Доброго времени суток!
Есть у меня просто класс
class test:
..............
field = 1
..............
t = test()
.....
blabla = t.field
class test:
..............
_field = 1
..............
def field(self):
return self._field
..............
t = test()
.....
blabla = t.field()
Отредактировано (Окт. 13, 2008 14:43:50)
Офлайн
Тут разница именно в принципе.
В первом случае - это аналог public поля, а во втором - private. Инкапсуляция в питоне не реализована на уровне языка, а реализовывается
так, как это сделано во втором примере.
То есть на примере 2 объявляют поле ‘__название’ если это поле будет использоваться только методами этого класса, а доступ напрямую из вне не предусматривается. В первом случае - предусматривается чтение/запись не только внутри класса.
Кроме того есть ещё property().
А как правильно писать - зависит от цели.
Отредактировано (Окт. 14, 2008 00:07:40)
Офлайн
То есть, если мне нужно извне менять это поле, то можно его оставить просто как field и не писать обертки и это нормально с точки зрения питона?
вопрос возник когда знакомый сказал, что такой доступ к полям это не хорошо и надо обязательно писать геттеры и сеттеры.
Он, правда на яве программирует. может там такое обязательно…
Отредактировано (Окт. 13, 2008 15:31:12)
Офлайн
Твой друг прав, это проблема идеалогии и уровня абстракций
Сейчас это просто поле, а завтра его нужно будет проверять на валидность, сбрасывать кэш и ещё бог знает что
Поэтому пишут сеттер и геттер чтобы потом проще менять логику.
Но в обычном приложении это не столь важно
Офлайн
То есть, если мне нужно извне менять это поле, то можно его оставить просто как field и не писать обертки и это нормально с точки зрения питона?Да.
вопрос возник когда знакомый сказал, что такой доступ к полям это не хорошо и надо обязательно писать геттеры и сеттеры.Да, в Java это уже практически правило, хотя есть возможность писать и public поля, насколько я знаю. Но там хорошим тоном есть инкапсуляция таких данных. Я против избыточности в коде, и использую такой доступ к полям, только если они составные или требуют валидации/форматирования.
Он, правда на яве программирует. может там такое обязательно…
Отредактировано (Окт. 13, 2008 16:53:17)
Офлайн
lorien
Насколько я знаю подчёркивание просто определяет метод/поле как внутреннее для программиста, и никак не ограничивается при использовании. Просто программист встретив такое оформление будет знать, что код используется только внутри класса, и использование его в другом месте нежелательно.
Офлайн
Ferromanхм… private было бы, если два подчеркивания перед именем…
В первом случае - это аналог public поля, а во втором - private.
Офлайн
Daevaorn
Да, абсолютно правильно, исправил.
Дополнение:
Одиночное подчёркивание в начале имени атрибута говорит о том, что метод не предназначен для использования вне методов класса (или вне функций и классов модуля), однако, атрибут все-таки доступен по этому имени. Два подчёркивания в начале имени дают несколько большую защиту: атрибут перестает быть доступен по этому имени.
Отредактировано (Окт. 14, 2008 03:00:20)
Офлайн
FerromanУ property есть один неприятный момент при наследовании:
Это удобно делать через property, особенно если поле существует давно, и просто нужно дописать новый функционал, а на него много чего завязано уже.
class A(object):
def _get_name(self):
return 'A'
name = property(_get_name)
class B(A):
def _get_name(self):
return 'B'
In [10]: b.name
Out[10]: 'A'
Офлайн
PooHперекрытие самого свойства решает проблему
У property есть один неприятный момент при наследовании::(In [10]: b.name
Out[10]: 'A'
class B(A):
def _get_name(self):
return 'B'
name = property(_get_name)
>>> b = B()
>>> b.name
'B'
Офлайн