Найти - Пользователи
Полная версия: Как избавиться от self в методах классов?
Начало » Python для новичков » Как избавиться от self в методах классов?
1 2 3 4 5
AlekseyPython
Eclipse IDE Version: 2018-09 (4.9.0)
Python 3.7.1

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

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

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

AlekseyPython
Или может быть есть какие- то другие пути избавления от self- ада?
не используйте классы, не будет self. в чем проблема?
AlekseyPython
а код ваш неудобочитаем потому что там много копипасты.
В коде СОВЕРШЕННО нет копипасты. Попробуйте найти хоть одну повторяющуюся строку.

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

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


PEHDOM
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/
Так что вы уж определитесь что вам нужно: “шашечки” или “ехать”.
AlekseyPython
из вашего скриншота просто бросаеться в глаза повторяющиеся:
В каждой ветке дальше идут РАЗНЫЕ выражения. И это упрощает код, потому что каждое состояние можно читать отдельно (изначально это было несколько функций, но я их объединил в одну, чтобы видеть общую картину в последовательности изменений состояний).

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

Вот кстати интересная публикация про пайтон и классы, весьма поучительно, как по мне. https://habr.com/post/140581/
Основной смысл публикации: пишите максимально ПРОСТОЙ КОД. Чего я тут и пытаюсь добиться: сейчас код на треть засорен отвлекающим от сути мелким мусором.
py.user.next
  
state, a, b, c = self.state, self.a, self.b, self.c
if state == States.RETURNED_BIG:
    if a:
        ...
AlekseyPython
py.user.next
Спасибо, я уже думал об этом, но посчитал, что упадет производительность. Сейчас пришел к такому решению (чтобы меньше было дребезжащего self.):
1. Константные члены делать глобальными переменными модуля (даже если логически они и относятся к объекту).
2. Переменные нужные только в одном методе не делать членами объекта, а создавать в виде локальных переменных метода (и передавать их вниз по стеку в качестве параметров методов).
3. Приватные методы объекта делать глобальными процедурами модуля.

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

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

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

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

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