Форум сайта python.su
py.user.next
Так нельзя смотреть. Происходит привязка программы к внутреннему содержимому объекта. Это что-то вроде глобальных переменных - то есть на первый взгляд выглядит удобным, но делать так нельзя.
py.user.next
Если это свойство, то оно и должно попасть, так как свойство предназначено для использования объекта снаружи .
py.user.next
Свойства - часть интерфейса объекта. Каким бы ни было его содержимое, свойства гарантируют определённое поведение.
py.user.next
Видимо, чтобы не перекодировать их лишний раз из юникода в ascii.
Офлайн
AlenПоймите, код “для себя” и библиотечный код - это разная степень ответственности. То, что можно списать на “да в нашей конторе таких дураков нет”, не работает, когда вы делаете потенциально широко используемую библиотеку. “Зачем столько лишнего кода” - вообще о чем речь? Речь о паре десятков строчек, в чем проблема? Найдите в программе узкие места: утечки памяти, неэффективные решения, логические ошибки и критикуйте. В чём ваша конструктивная критика? Вы не понимаете, зачем нужны неизменяемые свойства? Вы не понимаете, в чем смысл соглашений об именах переменных, и зачем ставят “_” в начале? Вас пугает объём кода? Вы, видимо, не видели нормальной программы на С++.
Хорошее обоснование дал FishHook, мол защита от дурака, но вот только не от изобретательного дурака, потому как тот сделает всё равно сделает присваивание обратившись к свойству с подчеркиванием, в данном случае к _encoding.
Офлайн
FishHook
“Зачем столько лишнего кода” - вообще о чем речь? Речь о паре десятков строчек, в чем проблема?
FishHook
Вы не понимаете, зачем нужны неизменяемые свойства?
FishHook
В чём ваша конструктивная критика?
FishHook
Вас пугает объём кода? Вы, видимо, не видели нормальной программы на С++.
FishHook
Вы не понимаете, в чем смысл соглашений об именах переменных, и зачем ставят “_” в начале?
FishHook
Объективно, коллега, вы рано пытаетесь спорить в форуме для экспертов.
Офлайн
Это частная вечеринка или участвовать могут все?
По вопросу. Поддержу Alen касательно использования декоратора property. Уж очень сомнительным кажется такой подход. А если у меня 25 атрибутов-свойств? Дублировать каждый и городить на каждый property, чтобы его не могли поменять явно извне?
Это раз. Во-вторых. Полностью отсутствует docstring, а автор (с его слов, между прочим) беспокоится о защите отдельным атрибутов от записи. Да еще и таким экзотическим образом? Ну как-то по-мне это должно вызвать определенные опасения…
И последнее. Офигенные переменные l, k, v перечеркивают всю высокопарную шушеру относительно защиты атрибутов, которую тут пытаются так активно впарить
Отредактировано 4kpt_III (Март 12, 2015 20:53:21)
Офлайн
AlenПотому что сковываешь объект.
Да почему же нельзя?
class A: x, y, z = 1, 2, 3 class B: x, y, z = 4, 5, 6 class C: x, y, z = 7, 8, 9 def f1(): a = A() b = B() return a.x + a.y + b.x + b.y def f2(): a = A() c = C() return a.x + a.y + c.x + c.y def f3(): return f1() + f2() f3()
AlenЕсть эффективная архитектура, выработанная годами, потому что когда-то через всю это хрень люди уже проходили.
По мне так, такая парадигма идет из языков с наличием приватных и защищенных методов и свойств, где можно описать отдельно логику класса и его интерфейсы, только вот для python это не работает.
AlenЧто человек написал, я вообще не смотрю. Я просто знаю, что должно быть в приличных исходниках.
Причём по отсутствию docstring, видно что человек о документировании совершенно не думал и PEP8/PEP257 вообще побоку.
AlenОчень часто свойство просто возвращает или устанавливает скрытый атрибут (с подчёркиванием в имени). Ты не думал, зачем так сделано?
Декоратор property делает из метода свойство и это много где нужно
AlenДа забудь про них, ты их код использовать не будешь. Они просто не потянут написать код, который кому-то пригодится.
но вот только не от изобретательного дурака
Отредактировано py.user.next (Март 13, 2015 02:08:16)
Офлайн
py.user.next
Потому что сковываешь объект.
Офлайн
py.user.next
Классы A, B, C находятся в файле x.py, функции f1, f2 находятся в файле y.py, функция f3 и её вызов находятся в файле z.py.
Теперь посмотрим, что можно сделать спустя какое-то время. Файл z.py мы можем отредактировать и функцию f3 переписать на другие функции . Файл y.py мы можем отредактировать и функции f1 и f2 переписать на другие классы. Файл x.py мы не можем редактировать, так как функции f1 и f2 зависят от содержимого классов. Мы не можем ни имена поменять, ни типы, ни значения.
Открывая файл x.py, откуда мы знаем, что мы не можем поменять классы? ниоткуда, мы меняем - и программа ломается. И тут мы понимаем, что какой-то знаток привязал свои функции к содержимому класса.
Офлайн
4kpt_IIIНе можешь менять его внутри.
Что значит “сковываешь объект”?
4kpt_IIIФрагмент:
Приведите как должно быть
class A: _x = 1 y, z = 2, 3 @property def x(self): return self._x class B: _x = 1 y, z = 2, 3 @property def x(self): return self._x def f(): a = A() b = B() return a.x + b.x f()
Отредактировано py.user.next (Март 13, 2015 02:43:18)
Офлайн
Спасибо. Идею понял. Но все равно как-то коряво получается. Возможно это болячка питона, но если действительно тьма переменных для внутреннего использования (ну не тьма, а хотя-бы с десяток) - не код будет, а просто жесть.
P.S. Ну и меня учили, что интерфейс это немножко другое. Сейчас у меня немножко шаблон рвется… Хотя идею уловил достаточно полно. Вот сижу думаю как быть когда таких атрибутов много. Ведь решение где-то должно быть рядом.
Отредактировано 4kpt_III (Март 13, 2015 02:43:52)
Офлайн
4kpt_IIIДля внутреннего использования применяются обычные атрибуты. Свойство - это то, что выставляется наружу, это как методы get и set, совмещённые в одном имени.
если действительно тьма переменных для внутреннего использования
4kpt_IIIНу, там несколько определений. Вот пишущюю ручку взять - у неё есть интерфейс. Чтобы ею писать, её раскручивать не нужно. Она уже так сделана, что её только взял, а она уже направлена на бумагу.
Ну и меня учили, что интерфейс это немножко другое.
Отредактировано py.user.next (Март 13, 2015 02:53:04)
Офлайн