Форум сайта python.su
NabИмена переменных? На русском?
У меня же имена на русском
NabНу перенесите на другую строку, если не влазит. Из-за того, что не влазит в строку надо говнокодить,
но только в том случае, если влазит в строку
NabПокажите где смотрели, тоже хочется.
Паттерны питоновские я смотрел
NabВ том что они нахер не нужны! Ни методы, ни проперти.
Ну и на питоне можно метода писать… В чём суть претензий я так и не понял.
NabСкажите, чем вам вот такой интерфейс
Для интерфейса класса - так понятно
class A: def__init__(self): self.foo = 1
class A: def__init__(self): self.__foo = 1 @property def foo(self): return self.__foo
Отредактировано FishHook (Март 14, 2016 18:35:32)
Офлайн
4kpt_IVЭто один из принципов SOLID, они очень общи, и ТС как-то невероятно упрощенно его понимает. Я читал у Роберта Мартина в “Быстрая разработка программного обеспечения” ISBN 5-8459-0558-3, вторая часть.
Укажите в книге этот принцип, если можно. Я про него не слышал.
Отредактировано PooH (Март 14, 2016 19:23:17)
Офлайн
FishHookДа, ваш пример лучше. Согласен.
Ну перенесите на другую строку, если не влазит.
FishHookУ Саммерфилда. Думаю, вы тут вкурсе.
Покажите где смотрели, тоже хочется.
FishHookНу ладно. Теперь понимаю, что вы просто не вкурсе поэтому объясню: инкапсуляция данных нарушается - атрибут, у вас, изначально открыт.
Скажите, чем вам вот такой интерфейс, хуже чем такой
Офлайн
NabВы много внимания уделяете закрытости, а в питоне вообще нет закрытых атрибутов. Даже если вы понатыкаете подчеркиваний, нет гарантий отсутствия доступа к этому полю.
инкапсуляция данных нарушается - атрибут, у вас, изначально открыт.
NabМне кажется вас ввели в заблуждение примеры использования property. Из того что я встречал, они используются когда надо выполнить дополнительные действия при доступе к атрибуту.
Вообще, в питоне принято property писать, даже если переменная с одним подчёркиванием.
Офлайн
doza_andАтрибуты с подчёркиванием в начале не включаются в help, будь то поля или методы.
Переменная с подчеркиванием появляется в примере когда надо освободить имя для свойства.
>>> class A: ... a = 1 ... _b = 2 ... ... def c(self): ... pass ... ... def _d(self): ... pass ... >>> help(A)
Help on class A in module __main__: class A(builtins.object) | Methods defined here: | | c(self) | | ---------------------------------------------------------------------- | Data descriptors defined here: | | __dict__ | dictionary for instance variables (if defined) | | __weakref__ | list of weak references to the object (if defined) | | ---------------------------------------------------------------------- | Data and other attributes defined here: | | a = 1
>>> class A: ... ... _a = None ... ... def __init__(self, a): ... self._a = a ... ... @property ... def a(self): ... """Свойство ашности""" ... return self._a ... >>> a = A(1) >>> a.a 1 >>> a.a = 2 Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: can't set attribute >>> >>> help(a)
Help on A in module __main__ object: class A(builtins.object) | Methods defined here: | | __init__(self, a) | | ---------------------------------------------------------------------- | Data descriptors defined here: | | __dict__ | dictionary for instance variables (if defined) | | __weakref__ | list of weak references to the object (if defined) | | a | Свойство ашности
FishHookЭто не интерфейс, интерфейс - это то, что ты можешь использовать снаружи. А в данном случае self.foo создана для использования изнутри. Если ты начнёшь её использовать снаружи, то наружние пользователи свяжут её. Что это значит: когда ты захочешь прорефакторить (или дополнить) этот класс и окажется, что её нужно переименовать или вообще удалить, ты не сможешь этого сделать, потому что наружние пользователи будут её искать. Когда же у тебя свойство, оно остаётся в любом случае, а внутреннее устройство класса может становиться любым.
Скажите, чем вам вот такой интерфейсclass A: def__init__(self): self.foo = 1
NabЭто безграмотная хрень, когда ты не можешь делать короткие и ясные имена. Никто не будет читать километровые имена, на это просто нет времени.
У меня же имена на русском, ещё более ёмкие по смыслу и более длинные.
NabМимо этого тоже невозможно пройти. В C нет методов, ты путаешь C и C++. Это разные языки. В частности, интерпретатор питона написан на C89, поэтому классов в его исходниках не найдёшь.
В сях, джаве или шарпе, был бы метод.
Отредактировано py.user.next (Март 15, 2016 04:29:03)
Офлайн
py.user.nextНаружние пользователи точно так же будут искать свойство, которое я решу порефакторить и удалить или переименовать.
Что это значит: когда ты захочешь прорефакторить (или дополнить) этот класс и окажется, что её нужно переименовать или вообще удалить, ты не сможешь этого сделать, потому что наружние пользователи будут её искать. Когда же у тебя свойство, оно остаётся в любом случае, а внутреннее устройство класса может становиться любым.
class A: def __init__(self): self.a = 1
class A: def __init__(self): self._a = 1 @property def a(self): if self._a > 1: self.warning("A > 1") return self._a
Отредактировано FishHook (Март 15, 2016 04:59:42)
Офлайн
NabИ что же в этом плохого?
атрибут, у вас, изначально открыт
Офлайн
FishHookСвойство никакого отношения к внутренностям не имеет, оно делается для внешних пользователей, которые просто читают внешнее описание класса.
Наружние пользователи точно так же будут искать свойство, которое я решу порефакторить и удалить или переименовать.
FishHookНе, а ты из вот этого, сделай вот это
Когда в процессе развития проекта я решу усложнить логику, я всегда могу из этогоclass A: def __init__(self): self.a = 1
class A: def __init__(self): self.some_a = 1
Отредактировано py.user.next (Март 15, 2016 06:41:05)
Офлайн
py.user.next
Да блин!!!
Ну сделал я так
class A: def __init__(self): self.__some = 1 @property def some(self): return self.__some
Офлайн
В том-то и дело, что внутренние поля не входят в интерфейс, поэтому ты можешь их менять, как хочешь и когда угодно. А когда они у тебя входят в интерфейс, то ты их не можешь менять никогда.
А эта идея, что якобы ты можешь его сделать свойством в любой момент, когда нужно будет внутри всё переделать, тоже выглядит не ахти. Что у тебя получится, что половина будет в виде внутренних полей, а половина в виде свойств?
Вот у тебя был код
>>> class A: ... def __init__(self): ... self.a = 1 ... self.b = 2 ... >>> def f(): ... a = A() ... return a.a, a.b ... >>> f() (1, 2) >>>
>>> class A: ... def __init__(self): ... self.some_a = 1 ... self.b = 2 ... >>> def f(): ... a = A() ... return a.a, a.b ... >>> f() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 3, in f AttributeError: 'A' object has no attribute 'a' >>>
>>> class A: ... def __init__(self): ... self.some_a = 1 ... self.b = 2 ... ... @property ... def a(self): ... return self.some_a ... >>> def f(): ... a = A() ... return a.a, a.b ... >>> f() (1, 2) >>>
Отредактировано py.user.next (Март 15, 2016 09:07:15)
Офлайн