Форум сайта python.su
0
Класс является пространством имён для своих констант. Ты вообще понимаешь, что в разных классах могут быть константы с одинаковыми именами, но с разными значениями? Предложения вынести всё из класса в модуль тоже вызывают подозрения, что ты не понимаешь, что делаешь.
То ты теряешь модульный функционал.А это что такое? В каждом модуле у меня будет только по 1 классу (это хорошая практика программирования). Я не хочу заниматься метапрограммированием, меня интересует только работа с классом, импортированным из модуля (который по сути будет представлять интерфейс, поскольку все внутренности из него выброшены в модуль). Поэтому не вижу проблем в предложенном решении при такой парадигме программирования. Программа пишется для конкретной цели без желания создавать переносимые пакеты.
Отредактировано AlekseyPython (Дек. 2, 2018 19:41:36)
Офлайн
857
Приведи код своего класса. Ты слишком много говоришь, в программировании так не принято. Принято приводить код, потому что говорить можно всё что угодно, а код всё за тебя скажет сам.
AlekseyPythonТы хоть один проект читал?
В каждом модуле у меня будет только по 1 классу (это хорошая практика программирования).
AlekseyPythonТы не ориентируешься в понятиях. Складывание классов в модуль - это не метапрограммирование.
Я не хочу заниматься метапрограммированием
AlekseyPythonКласс инкапсулирует всю свою хрень, относящуюся только к нему. У него есть свои константы, которые касаются только его. У другого класса есть свои константы с теми же именами, относящиеся только к нему. Поэтому, читая код, ты всегда всегда видишь, что константа LEGS_NUMBER принадлежит этому классу или тому.
Чем первое решение лучше второго?
if num == Dog.LEGS_NUMBER: return 'dog' elif num == Cat.LEGS_NUMBER: return 'cat' elif num == Bird.LEGS_NUMBER: return 'bird'
if num == LEGS_NUMBER: return 'dog' elif num == LEGS_NUMBER: return 'cat' elif num == LEGS_NUMBER: return 'bird'
if num == mod_dog.LEGS_NUMBER: return 'dog' elif num == kitty.LEGS_NUMBER: return 'cat' elif num == animals.LEGS_NUMBER: return 'bird'
Отредактировано py.user.next (Дек. 3, 2018 01:35:54)
Офлайн
0
Ты не ориентируешься в понятиях. Складывание классов в модуль - это не метапрограммирование.Вообще- то я отдельно писал, что у меня будет по 1 классу в модуле. Поэтому почему вы решили, что в метапрограммирование я вкладываю именно такой смысл- не понятно (зачем мне дважды писать одно и тоже?). Метапрограммирование я упомянул, потому что единственная проблема, которую я вижу при складировании “потрохов” класса в модуль- “засирание” модуля и как следствие- необходимость это учитывать при динамическом создании классов (нельзя нечаянно “смахнуть” переменные модуля, поскольку они логически связаны с остальным кодом).
Поэтому, читая код, ты всегда всегда видишь, что константа LEGS_NUMBER принадлежит этому классу или тому.if num == Dog.LEGS_NUMBER: return 'dog' elif num == Cat.LEGS_NUMBER: return 'cat' elif num == Bird.LEGS_NUMBER: return 'bird'
Отредактировано AlekseyPython (Дек. 3, 2018 06:57:08)
Офлайн
857
AlekseyPythonЗнаешь, не поленился и полазил у него в репозитории
Егор Бугаенко — Объектно-ориентированное вранье
#include <stdio.h>
#include <unistd.h>
int main() {
char ch;
int count = 0;
while (1) {
if (read(STDIN_FILENO, &ch, 1) <= 0) {
break;
}
if (ch == ' ') {
++count;
}
}
if (count > 0) {
++count;
}
printf("%d\n", count);
return 0;
}
[guest@localhost c]$ .ansi wc.c -o wc
[guest@localhost c]$ echo " " | ./wc
2
[guest@localhost c]$
AlekseyPythonЯ тебе привёл то, как сделано в Qt. Оно даже не на питоне использует такой подход, хотя в C++ есть конструкция для определения пространства имён для подобных вещей. А в питоне конструкции для определения пространств имён нет, поэтому используются модули и классы. Если выполнишь import this в интерпретаторе, там увидишь одно из правил как раз для пространств имён.
Я придерживаюсь практики программирования, в которой из класса не вытаскивают его потроха
Отредактировано py.user.next (Дек. 3, 2018 13:22:39)
Офлайн
0
Я тебе привёл то, как сделано в Qt.
Офлайн
857
>>> import PyQt5.QtCore >>> PyQt5.QtCore.Qt.AlignTop 32 >>> PyQt5.QtCore.Qt <class 'PyQt5.QtCore.Qt'> >>> PyQt5.QtCore <module 'PyQt5.QtCore' from '/usr/lib64/python3.6/site-packages/PyQt5/QtCore.so'> >>> PyQt5 <module 'PyQt5' from '/usr/lib64/python3.6/site-packages/PyQt5/__init__.py'> >>>
>>> class Bird: ... ... LEGS_NUMBER = 2 ... ... def fly(self): ... return 'fly with {} legs'.format(Bird.LEGS_NUMBER) ... >>> class Dog: ... ... LEGS_NUMBER = 4 ... ... def run(self): ... return 'run on {} legs'.format(Dog.LEGS_NUMBER) ... >>> def do(legs_number): ... if legs_number == Dog.LEGS_NUMBER: ... obj = Dog() ... val = obj.run() ... elif legs_number == Bird.LEGS_NUMBER: ... obj = Bird() ... val = obj.fly() ... return (obj, val) ... >>> do(2) (<__main__.Bird object at 0x7fb951251e48>, 'fly with 2 legs') >>> do(4) (<__main__.Dog object at 0x7fb951251e80>, 'run on 4 legs') >>>
Отредактировано py.user.next (Дек. 3, 2018 10:25:48)
Офлайн
186
> Или может быть есть какие- то другие пути избавления от self- ада?
Есть. Пользуйся ЯП где не используется подобный подход.
> В каждом модуле у меня будет только по 1 классу (это хорошая практика программирования)
Это ужасная “практика программирования”.
Офлайн
0
PyQt5 - пакет
PyQt5.QtCore - модуль
PyQt5.QtCore.Qt - класс
PyQt5.QtCore.Qt.AlignTop - константа
Отредактировано AlekseyPython (Дек. 3, 2018 10:29:19)
Офлайн
857
AlekseyPythonС которым появляется связь у класса. Тут глобальное пространство имён, с которым связан каждый из классов Qt, использующий константы. Если мы захотим переименовать какие-то константы в пространстве имён, то внутри класса, который эти константы использует, тоже надо будет их переименовывать. Если мы захотим переименовать константы внутри класса, то в пространстве имён их тоже понадобится переименовывать. В этом и есть связь.
Так что в Qt константы вынесены из классов и лежат в неймспейсе
Отредактировано py.user.next (Дек. 3, 2018 10:40:44)
Офлайн
0
А без этого AA имя константы столкнётся с другим таким же именем и вызовет конфликт имён, потому что в этом пространстве имён определены десятки имён для похожих классов.
А когда ты в классе держишь константу, тебе не нужно ей писать AA в начале, потому что сам класс выполняет функцию AA.
Отредактировано AlekseyPython (Дек. 3, 2018 10:50:42)
Офлайн