Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 3, 2018 10:51:04

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

Как избавиться от self в методах классов?

Вот пример
https://doc.qt.io/qt-5/qlocalserver.html

  
>>> import PyQt5.QtNetwork
>>> 
>>> PyQt5.QtNetwork.QLocalServer.UserAccessOption
1
>>>

Для свойства socketOptions класс предоставляет внутренние константы, которые можно использовать снаружи.


AlekseyPython
Такая проблема возниакает только если у вас неправильный стиль программирования
Это не моя проблема, так как этот префикс AA не я придумывал, чтобы защитить имя константы от столкновения с таким же именем константы для другого класса. Это они собрали всё в одну кучу, а потом стало понятно, что стало сложно придумывать новые имена километровые. AA - это пространство имём в старом стиле, когда ещё не было классов в языках. Древние функции fopen() и fclose() как раз и используют букву f для задания пространства имён. Так мы понимаем, что функции open() и close() относятся к файловому объекту. Это древний метод. И вот к этому древнему методу вернулись в Qt, так как не расчитали, что начнутся коллизиии, когда имён станет слишком много.



Отредактировано py.user.next (Дек. 3, 2018 11:01:22)

Офлайн

#2 Дек. 3, 2018 11:57:17

AlekseyPython
Зарегистрирован: 2018-10-24
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Как избавиться от self в методах классов?

Для свойства socketOptions класс предоставляет внутренние константы, которые можно использовать снаружи.

socketOptions описано в разделе “Public Types”, т.е. это новый тип определенный внутри класса (также как определены итераторы внутри контейнеров в библиотеке STL).

Если вы слегка потрудитесь и посмотрите список публичных функций в вашей ссылке, то увидите такие:
void setSocketOptions(QLocalServer::SocketOptions options)
QLocalServer::SocketOptions socketOptions() const
, т.е этот параметр читается / пишется с помощью специальных публичных методов, которые по сути являются интерфейсами к внтуреннему полю.

..чтобы защитить имя константы от столкновения с таким же именем константы для другого класса
А зачем вы константу из класса используете в клиентском коде? Потому что реализуете там какую- то бизнес- логику присущую этому классу (если такое значение константы, то я поступлю вот так, а если другое, то я сделаю иначе). Собирите всю бизнес- логику в классе и не придется анализировать какие- либо константы.

Отредактировано AlekseyPython (Дек. 3, 2018 11:59:39)

Офлайн

#3 Дек. 3, 2018 12:28:14

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как избавиться от self в методах классов?

AlekseyPython
В каждой ветке дальше идут РАЗНЫЕ выражения.
там идут почти идентичные выражения отличающиеся одной строчкой. Но это не суть, иногда такое бывает , особенно когда нужно чтото быстро написать “на коленке”, чтоб вот оно заработало “прям щас”, но потом это все всеравно нужно причесывать. Подумайте об другом, в мире десятки тысяч программистов пишущих на пайтоне, если бы действительно “self”-ы замусоривали исходники, и мешали читаемости, эту проблему давно бы уже подняли и както научились обходить, или придумали какойнитб спецсимвол заменяющий self.
Тут скорее действительно проблема с архитектурой как уже выше писал py.user.next.
Да кстати вы можете форкнуть пайтон и написать свой, с преферансом и стюардесами, где таки будете обращаться к аттрибутам класса через “@my_variable”

AlekseyPython
Тогда зачем было мучатся и писать Python, если в итоге пришли к тому же Си?
в первую очередь изза простоты, скорости написания и чтения кода, а отнюдь не изза класов. Python поддерживает несколько парадигм программирования: структурное, объектно-ориентированное, функциональное, императивное и аспектно-ориентированное.

AlekseyPython
Основной смысл публикации: пишите максимально ПРОСТОЙ КОД.
основной смысл публикации не пишите классы там где они не нужны.

AlekseyPython
Спасибо, я уже думал об этом, но посчитал, что упадет производительность.
В определенных случаях, такой подход даже приветствуеться и позволяет повысить быстродейтвие.

AlekseyPython
2. Переменные нужные только в одном методе не делать членами объекта, а создавать в виде локальных переменных метода (и передавать их вниз по стеку в качестве параметров методов).
А вы что же на каждый чих обьявляете новый атрибут?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#4 Дек. 3, 2018 13:17:26

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

Как избавиться от self в методах классов?

AlekseyPython
Если вы слегка потрудитесь и посмотрите список публичных функций в вашей ссылке, то увидите такие:
void setSocketOptions(QLocalServer::SocketOptions options)
QLocalServer::SocketOptions socketOptions() const
, т.е этот параметр читается / пишется с помощью специальных публичных методов, которые по сути являются интерфейсами к внтуреннему полю.
Это свойство объекта. Чтобы устанавливать его значения, сделано перечисление в классе. Чтобы передать аргумент в этот метод установки значения, мы берём имя класса и через него получаем доступ к перечислению внутри класса.

Вот так оно будет вызвано
server.setSocketOptions(QLocalServer::UserAccessOption | QLocalServer::GroupAccessOption);

AlekseyPython
Собирите всю бизнес- логику в классе и не придется анализировать какие- либо константы.
Какую бизнес-логику собирать в классе, если она не относится к его внутренностям? Мы используем класс снаружи и общаемся с его методами на его языке. Класс знает, что означают его константы, какие у них значения, а мы их просто используем, чтобы давать его методам определённые команды. При этом он является пространством имён, позволяя делать эти константы с любыми именами, не оглядываясь на константы других классов.



Отредактировано py.user.next (Дек. 3, 2018 13:28:00)

Офлайн

#5 Дек. 3, 2018 13:30:57

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как избавиться от self в методах классов?

AlekseyPython
Егор Бугаенко — Объектно-ориентированное вранье
м-да, чувак, в основном, лепит какието свои фантазии, и на этом основани иделает выводы что все не умеют програмировать.



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#6 Дек. 3, 2018 13:50:52

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

Как избавиться от self в методах классов?

PEHDOM
м-да, чувак, в основном, лепит какието свои фантазии
Там в конце слушатели над ним прикалываются



Офлайн

#7 Дек. 3, 2018 16:39:02

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Как избавиться от self в методах классов?

py.user.next
Там в конце слушатели над ним прикалываются
Да, прям слушаю, и в голове такое :"Нам нужно построить больше зикуратов классов"



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#8 Дек. 3, 2018 19:57:15

Rafik
Зарегистрирован: 2018-09-04
Сообщения: 231
Репутация: +  27  -
Профиль   Отправить e-mail  

Как избавиться от self в методах классов?

Я всего лишь юзверь, пишущий краткие скрипты, но несмторя на это выскажу свою мнение про подход ТС к ООП. Такой подход мне не очень нравится. Это какая-то крайность, в которую не следует впадать.
В лекции

AlekseyPython
Егор Бугаенко — Объектно-ориентированное вранье
лектор утверждает, что “чем больше маленьких классов в коде, тем лучше”. Там же подаётся идея: на каждый чих - свой класс.
ТС утверждает
AlekseyPython
В каждом модуле у меня будет только по 1 классу…
Вопрос к ТС: для средненького проектика сколько файдов надо создать? 1001+ ? Как разобрться потом в такой уйме файлов?
Давайте прикинем сколько файлов надо будет создать чтобы мне получить через диалог (стандартный диалог tkinter) папку, откуда взять файлы фоток. Затем эти фотки раскидать (копировать) по папкам вида $HOME/fotki/год_из_exif/месяц_оттуда_же/число, далее поместить информацию в БД (sqlite3): куда сохранён файл (полное имя), его md5 и миниатюрка (thumbnail). Кстати, надо учесть такой факт - если при копировании имеется файл с таким же именем и по тому же пути, но md5 не совпадает - необходимо переименовать копируемый файл.
У меня этот момент легко помещается в два небольших файлика. В одном файле классы для GUI (не только диалог), а во втором само копирование.
Вопрос к ТС: “Сколько классов (файлов) необходимо создать при Вашем подходе?”

Офлайн

#9 Дек. 4, 2018 08:10:08

AlekseyPython
Зарегистрирован: 2018-10-24
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Как избавиться от self в методах классов?

Подумайте об другом, в мире десятки тысяч программистов пишущих на пайтоне, если бы действительно “self”-ы замусоривали исходники, и мешали читаемости, эту проблему давно бы уже подняли и както научились обходить, или придумали какойнитб спецсимвол заменяющий self.

Вот что думают другие программисты про ‘self.’:


И да, в других языках, например, в Ruby уже придумали замену ‘self.’ на @

Офлайн

#10 Дек. 4, 2018 08:16:31

AlekseyPython
Зарегистрирован: 2018-10-24
Сообщения: 30
Репутация: +  0  -
Профиль   Отправить e-mail  

Как избавиться от self в методах классов?

При этом он является пространством имён, позволяя делать эти константы с любыми именами, не оглядываясь на константы других классов.

PEHDOM в данной теме приводил ссылку, девиз которой “не создавайте классов, где нужна только функция”. Но в этом случае имена функций также будут пересекаться и “перебивать” друг друга. Если вы так боитесь одинаковых названий (ведь так трудно в рамках модуля дать разные названия!), тогда для всего на свете создавайте классы (которые, черт побери, тоже могут иметь одинаковые названия!), чтобы не бояться пересечений имен.

Отредактировано AlekseyPython (Дек. 4, 2018 08:16:58)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version