Уведомления

Группа в Telegram: @pythonsu

#1 Март 12, 2015 17:20:04

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

vanished

py.user.next
Так нельзя смотреть. Происходит привязка программы к внутреннему содержимому объекта. Это что-то вроде глобальных переменных - то есть на первый взгляд выглядит удобным, но делать так нельзя.

Да почему же нельзя? Если переменная не меняется никоим образом после инициализации, то зачем городить огород? Это имеет смысл только в случае если какой-нибудь метод класса меняет свойство и нам необходимо получать состояние. Здесь ничего не меняется.

По мне так, такая парадигма идет из языков с наличием приватных и защищенных методов и свойств, где можно описать отдельно логику класса и его интерфейсы, только вот для python это не работает.

py.user.next
Если это свойство, то оно и должно попасть, так как свойство предназначено для использования объекта снаружи .

Оно и так и так попадет, причем отличаться не будет совершенно. Причём по отсутствию docstring, видно что человек о документировании совершенно не думал и PEP8/PEP257 вообще побоку.

py.user.next
Свойства - часть интерфейса объекта. Каким бы ни было его содержимое, свойства гарантируют определённое поведение.

Декоратор property делает из метода свойство и это много где нужно, но если человек делает из неизменяемого после инициализации свойства метод, а потом из него опять свойство, ну как это назвать?
Хорошее обоснование дал FishHook, мол защита от дурака, но вот только не от изобретательного дурака, потому как тот сделает всё равно сделает присваивание обратившись к свойству с подчеркиванием, в данном случае к _encoding.

Ну нет у python никакой приватности, просто нет.

py.user.next
Видимо, чтобы не перекодировать их лишний раз из юникода в ascii.

Ну натянуто как-то.

Офлайн

#2 Март 12, 2015 18:15:11

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

vanished

Alen
Хорошее обоснование дал FishHook, мол защита от дурака, но вот только не от изобретательного дурака, потому как тот сделает всё равно сделает присваивание обратившись к свойству с подчеркиванием, в данном случае к _encoding.
Поймите, код “для себя” и библиотечный код - это разная степень ответственности. То, что можно списать на “да в нашей конторе таких дураков нет”, не работает, когда вы делаете потенциально широко используемую библиотеку. “Зачем столько лишнего кода” - вообще о чем речь? Речь о паре десятков строчек, в чем проблема? Найдите в программе узкие места: утечки памяти, неэффективные решения, логические ошибки и критикуйте. В чём ваша конструктивная критика? Вы не понимаете, зачем нужны неизменяемые свойства? Вы не понимаете, в чем смысл соглашений об именах переменных, и зачем ставят “_” в начале? Вас пугает объём кода? Вы, видимо, не видели нормальной программы на С++.
Объективно, коллега, вы рано пытаетесь спорить в форуме для экспертов.



Офлайн

#3 Март 12, 2015 20:18:05

Alen
Зарегистрирован: 2013-08-01
Сообщения: 373
Репутация: +  49  -
Профиль   Отправить e-mail  

vanished

FishHook
“Зачем столько лишнего кода” - вообще о чем речь? Речь о паре десятков строчек, в чем проблема?

Ни в чём, если не учитывать, что сама библиотека не больше и исходить из начального посыла: «Как бы вы написали».

FishHook
Вы не понимаете, зачем нужны неизменяемые свойства?

Прекрасно понимаю, только вот в данном конкретном случае, считаю что не должно оно быть неизменяемым, не подходит оно по моим личным критериям. Вот если бы этот атрибут менялся хоть где-нибудь, тогда ок, а так нет. Хотите писать оверхед и оправдывать его чем либо — ваше личное дело, те доводы, которые я услышал мягко говоря натянуты.

FishHook
В чём ваша конструктивная критика?

Да её там навалом, что вы скажете о соблюдении PEP8, ну раз якобы библиотека публичная?

FishHook
Вас пугает объём кода? Вы, видимо, не видели нормальной программы на С++.

Серьезно?

FishHook
Вы не понимаете, в чем смысл соглашений об именах переменных, и зачем ставят “_” в начале?

С чего вы это взяли? Ну если я дал ссылку на PEP8, где собственно это соглашение и описано, вы думаете я его не читал?

FishHook
Объективно, коллега, вы рано пытаетесь спорить в форуме для экспертов.

Ок, Гвидо, я вас понял.

Офлайн

#4 Март 12, 2015 20:48:18

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

vanished

Это частная вечеринка или участвовать могут все?

По вопросу. Поддержу Alen касательно использования декоратора property. Уж очень сомнительным кажется такой подход. А если у меня 25 атрибутов-свойств? Дублировать каждый и городить на каждый property, чтобы его не могли поменять явно извне?

Это раз. Во-вторых. Полностью отсутствует docstring, а автор (с его слов, между прочим) беспокоится о защите отдельным атрибутов от записи. Да еще и таким экзотическим образом? Ну как-то по-мне это должно вызвать определенные опасения…

И последнее. Офигенные переменные l, k, v перечеркивают всю высокопарную шушеру относительно защиты атрибутов, которую тут пытаются так активно впарить

Отредактировано 4kpt_III (Март 12, 2015 20:53:21)

Офлайн

#5 Март 13, 2015 02:03:52

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

vanished

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()

Классы 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, откуда мы знаем, что мы не можем поменять классы? ниоткуда, мы меняем - и программа ломается. И тут мы понимаем, что какой-то знаток привязал свои функции к содержимому класса.

Alen
По мне так, такая парадигма идет из языков с наличием приватных и защищенных методов и свойств, где можно описать отдельно логику класса и его интерфейсы, только вот для python это не работает.
Есть эффективная архитектура, выработанная годами, потому что когда-то через всю это хрень люди уже проходили.

Alen
Причём по отсутствию docstring, видно что человек о документировании совершенно не думал и PEP8/PEP257 вообще побоку.
Что человек написал, я вообще не смотрю. Я просто знаю, что должно быть в приличных исходниках.

Alen
Декоратор property делает из метода свойство и это много где нужно
Очень часто свойство просто возвращает или устанавливает скрытый атрибут (с подчёркиванием в имени). Ты не думал, зачем так сделано?

Alen
но вот только не от изобретательного дурака
Да забудь про них, ты их код использовать не будешь. Они просто не потянут написать код, который кому-то пригодится.



Отредактировано py.user.next (Март 13, 2015 02:08:16)

Офлайн

#6 Март 13, 2015 02:21:02

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

vanished

py.user.next
Потому что сковываешь объект.

Подождите. Я запутался. Это же и есть соглашения. Что значит “сковываешь объект”? У Вас все равно класс обладает определенным набором методов и атрибутов. Если Вы поменяете их названия или сигнатуру (для методов), то никаких гарантий не будет, что у кого-то, кто написал код основываясь на Вашем предыдущем решении, что-то не отвалится. Ну а атрибуты для внутреннего использования или скрытые атрибуты это тоже только соглашения между разработчиком и пользователем.

P.S. Возможно я просто не могу ухватить Вашу мысль…

Офлайн

#7 Март 13, 2015 02:23:14

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

vanished

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, откуда мы знаем, что мы не можем поменять классы? ниоткуда, мы меняем - и программа ломается. И тут мы понимаем, что какой-то знаток привязал свои функции к содержимому класса.

Приведите как должно быть, основываясь на Вашем примере.

Офлайн

#8 Март 13, 2015 02:36:06

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

vanished

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()
Здесь классы A и B можно менять, переименовывая/заменяя/удаляя не только атрибуты y и z, но и атрибут _x, а всё общение с объектами а и b происходит через их интерфейсы (тут интерфейс содержит только свойство x).



Отредактировано py.user.next (Март 13, 2015 02:43:18)

Офлайн

#9 Март 13, 2015 02:40:57

4kpt_III
Зарегистрирован: 2014-12-22
Сообщения: 999
Репутация: +  39  -
Профиль   Отправить e-mail  

vanished

Спасибо. Идею понял. Но все равно как-то коряво получается. Возможно это болячка питона, но если действительно тьма переменных для внутреннего использования (ну не тьма, а хотя-бы с десяток) - не код будет, а просто жесть.

P.S. Ну и меня учили, что интерфейс это немножко другое. Сейчас у меня немножко шаблон рвется… Хотя идею уловил достаточно полно. Вот сижу думаю как быть когда таких атрибутов много. Ведь решение где-то должно быть рядом.

Отредактировано 4kpt_III (Март 13, 2015 02:43:52)

Офлайн

#10 Март 13, 2015 02:47:01

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9879
Репутация: +  853  -
Профиль   Отправить e-mail  

vanished

4kpt_III
если действительно тьма переменных для внутреннего использования
Для внутреннего использования применяются обычные атрибуты. Свойство - это то, что выставляется наружу, это как методы get и set, совмещённые в одном имени.

4kpt_III
Ну и меня учили, что интерфейс это немножко другое.
Ну, там несколько определений. Вот пишущюю ручку взять - у неё есть интерфейс. Чтобы ею писать, её раскручивать не нужно. Она уже так сделана, что её только взял, а она уже направлена на бумагу.



Отредактировано py.user.next (Март 13, 2015 02:53:04)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version