Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 1, 2018 10:21:35

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

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

Eclipse IDE Version: 2018-09 (4.9.0)
Python 3.7.1

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

Может есть какие- то IDE, позволяющие делать препроцессинг и как следствие использовать более удобные символы в коде для обращения к членам / методам класса? Или может быть есть какие- то другие пути избавления от self- ада?

Прикреплённый файлы:
attachment Screenshot_20181201_084523.png (105,7 KБ)

Офлайн

#2 Дек. 1, 2018 18:02:10

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

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

AlekseyPython
Но, к сожалению, удобочитаемость этого кода очень низкая из-за необходимости писать self при обращении к членам / методам класса.
ИМХО, наоборот, сразу видно что являеться атрибуто класса, а что нет. а код ваш неудобочитаем потому что там много копипасты.

AlekseyPython
использовать более удобные символы в коде для обращения к членам / методам класса?
использование self носит декларативеный характер, никто не мешает вам вместо self использовать “ более удобные символы ”. Только потом не жалуйтесь когда вас начнут бить ногами.

AlekseyPython
Или может быть есть какие- то другие пути избавления от self- ада?
не используйте классы, не будет self. в чем проблема?



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

Офлайн

#3 Дек. 1, 2018 18:47:03

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

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

а код ваш неудобочитаем потому что там много копипасты.
В коде СОВЕРШЕННО нет копипасты. Попробуйте найти хоть одну повторяющуюся строку.

никто не мешает вам вместо self использовать “ более удобные символы ”.
Нет, имена переменных могут состоять только из латинских букв, цифр и знаков подчеркивания. Я не могу например так обращаться к членам:
 @my_variable

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


Офлайн

#4 Дек. 1, 2018 20:01:00

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

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

AlekseyPython
коде СОВЕРШЕННО нет копипасты. Попробуйте найти хоть одну повторяющуюся строку.
из вашего скриншота просто бросаеться в глаза повторяющиеся:
 ....
if success: 
    if self.quantity_success >= self.quantity_success_down:
        self.quantity_success = 0
....
AlekseyPython
Нет, имена переменных могут состоять только из латинских букв, цифр и знаков подчеркивания.
Это неверно:
 class Foo:
    def __init__(Ψ, value):
        Ψ.value = value
    def test(Ψ):
        print(Ψ.value)
foo = Foo('The Ψ example')
foo.test()
>>> 
The Ψ example
>>> 

Конечно же вы не можете использовать абсолютно любые символы, хотя бы потому что некоторые из них для интерпретатора являються служебными, но латиницей оно точно не ограничено. Хотя конечно использование нелатиницы не поощеряется.
AlekseyPython
Я не могу например так обращаться к членам:
@my_variable
Естественно, собачка это для декораторов, иначе как интерпретатор сможет понять где обьявляется декорированя функция , а где ваша программа.
AlekseyPython
Тогда Python скатится до языка С, разработанного при динозаврах. Вы же отлично понимаете, что это не решение, зачем тогда делать вид, что решение найдено?
Вы удивитесь, но пайтон который все скачивают с https://www.python.org/ написан на чистом Си. Не С++, не С#, а именно С. В этом легко убедиться посмотрев исходники: https://github.com/python/cpython

ООП не панацея, а функциональное програмирование себя не изжило, и наврядли изживет в ближайшем будущем. Вот кстати интересная публикация про пайтон и классы, весьма поучительно, как по мне. https://habr.com/post/140581/
Так что вы уж определитесь что вам нужно: “шашечки” или “ехать”.



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

Отредактировано PEHDOM (Дек. 1, 2018 20:14:04)

Офлайн

#5 Дек. 2, 2018 09:28:22

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

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

из вашего скриншота просто бросаеться в глаза повторяющиеся:
В каждой ветке дальше идут РАЗНЫЕ выражения. И это упрощает код, потому что каждое состояние можно читать отдельно (изначально это было несколько функций, но я их объединил в одну, чтобы видеть общую картину в последовательности изменений состояний).

Вы удивитесь, но пайтон который все скачивают с https://www.python.org/ написан на чистом Си.
Тогда зачем было мучатся и писать Python, если в итоге пришли к тому же Си?

Вот кстати интересная публикация про пайтон и классы, весьма поучительно, как по мне. https://habr.com/post/140581/
Основной смысл публикации: пишите максимально ПРОСТОЙ КОД. Чего я тут и пытаюсь добиться: сейчас код на треть засорен отвлекающим от сути мелким мусором.

Офлайн

#6 Дек. 2, 2018 11:25:35

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

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

  
state, a, b, c = self.state, self.a, self.b, self.c
if state == States.RETURNED_BIG:
    if a:
        ...



Офлайн

#7 Дек. 2, 2018 14:09:47

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

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

py.user.next
Спасибо, я уже думал об этом, но посчитал, что упадет производительность. Сейчас пришел к такому решению (чтобы меньше было дребезжащего self.):
1. Константные члены делать глобальными переменными модуля (даже если логически они и относятся к объекту).
2. Переменные нужные только в одном методе не делать членами объекта, а создавать в виде локальных переменных метода (и передавать их вниз по стеку в качестве параметров методов).
3. Приватные методы объекта делать глобальными процедурами модуля.

Т.е. в объекте останутся только (и их нужно будет писать вместе с self):
1. Переменные, меняющие свое состояние во время жизни объекта.
2. Публичные методы.

Офлайн

#8 Дек. 2, 2018 15:06:51

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

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

AlekseyPython
Константные члены делать глобальными переменными модуля
Константы класса должны быть в классе. Доступ к ним через имя класса может быть получен как изнутри экземпляра этого класса, так и снаружи класса, даже когда нет ни одного экземпляра у него.

AlekseyPython
Переменные нужные только в одном методе не делать членами объекта
Если бы ты привёл класс свой полностью, тебе бы сказали, нормально ли он сделан. Возможно, он у тебя неправильно спроектирован и из-за этого и нарушилась читаемость.

AlekseyPython
Приватные методы объекта делать глобальными процедурами модуля.
Ты не понимаешь, что модуль питона тоже нужен, поэтому он должен быть построен классически. То есть модуль должен конкретно отвечать на вопрос “что делает этот модуль?”. Естественно, пространство имён модуля не должно быть замусорено, а все функции у него должны относиться к работе этого модуля, когда его используют снаружи как инструмент.



Отредактировано py.user.next (Дек. 2, 2018 15:08:32)

Офлайн

#9 Дек. 2, 2018 16:22:09

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

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

py.user.next, все это красивая теория. На практике вся эта “красота” оборачивается self- замусоренностью кода (или если затолкать что- либо в класс, то везде начинает маячить имя класса). Код не удается просто просматривать, как газетную статью, а приходится весь постоянно перечитывать (от чего сильно устаешь к концу рабочего дня).

Если правильно импортировать модули, а в модуле размещать по одному классу и при чтении исходников рассматривать весь модуль, как реализацию этого класса, то не вижу ничего плохого в предложенном решении.

Отредактировано AlekseyPython (Дек. 2, 2018 16:33:57)

Офлайн

#10 Дек. 2, 2018 17:20:44

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

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

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

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



Отредактировано py.user.next (Дек. 2, 2018 17:27:11)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version