Найти - Пользователи
Полная версия: vanished
Начало » Python для экспертов » vanished
1 2 3 4
Alen
py.user.next
Так нельзя смотреть. Происходит привязка программы к внутреннему содержимому объекта. Это что-то вроде глобальных переменных - то есть на первый взгляд выглядит удобным, но делать так нельзя.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Серьезно?

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

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

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

Ок, Гвидо, я вас понял.
4kpt_III
Это частная вечеринка или участвовать могут все?

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

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

И последнее. Офигенные переменные l, k, v перечеркивают всю высокопарную шушеру относительно защиты атрибутов, которую тут пытаются так активно впарить
py.user.next
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
но вот только не от изобретательного дурака
Да забудь про них, ты их код использовать не будешь. Они просто не потянут написать код, который кому-то пригодится.
4kpt_III
py.user.next
Потому что сковываешь объект.

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

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

Приведите как должно быть, основываясь на Вашем примере.
py.user.next
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).
4kpt_III
Спасибо. Идею понял. Но все равно как-то коряво получается. Возможно это болячка питона, но если действительно тьма переменных для внутреннего использования (ну не тьма, а хотя-бы с десяток) - не код будет, а просто жесть.

P.S. Ну и меня учили, что интерфейс это немножко другое. Сейчас у меня немножко шаблон рвется… Хотя идею уловил достаточно полно. Вот сижу думаю как быть когда таких атрибутов много. Ведь решение где-то должно быть рядом.
py.user.next
4kpt_III
если действительно тьма переменных для внутреннего использования
Для внутреннего использования применяются обычные атрибуты. Свойство - это то, что выставляется наружу, это как методы get и set, совмещённые в одном имени.

4kpt_III
Ну и меня учили, что интерфейс это немножко другое.
Ну, там несколько определений. Вот пишущюю ручку взять - у неё есть интерфейс. Чтобы ею писать, её раскручивать не нужно. Она уже так сделана, что её только взял, а она уже направлена на бумагу.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB