Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 4, 2018 09:17:06

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

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

AlekseyPython
И да, в других языках, например, в Ruby уже придумали замену ‘self.’ на @
первая конструктивная мысль за весь тред от Вас.
Вот это могло бы иметь смысл, но это не оч соответствует идеологии Python. Поэтому ее не вводили, хотя Python Foundation знают о Ruby. Я лично не вижу большого смысла.
ДА и проблема выглядит больше надуманной или скорее проблемой одного из миллиона.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#2 Дек. 4, 2018 09:41:19

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

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

AlekseyPython
Но в этом случае имена функций также будут пересекаться и “перебивать” друг друга.
У меня на C программы есть. Вот как ты думаешь, как я их делаю? При этом там нет классов и пространств имён нет.

А вот как

patcher.h
#ifndef PATCHER_H
#define PATCHER_H

#include <stdio.h>

int patcher_start(FILE *fp);
int patcher_patch(size_t offset, const char *bytes, size_t length);
int patcher_can_patch(long offset, long length);
int patcher_end();

#endif

patcher.c
#include "patcher.h"

static FILE *_fp;

int patcher_start(FILE *fp)
{
_fp = fp;
return 1;
}

int patcher_end(void)
{
_fp = NULL;
return 1;
}

int patcher_patch(size_t offset, const char *bytes, size_t length)
{
if (fseek(_fp, offset, SEEK_SET))
return 0;
if (fwrite(bytes, length, 1, _fp) != 1)
return 0;
return 1;
}

int patcher_can_patch(long offset, long length)
{
long old_offset, end_offset;

old_offset = ftell(_fp);
if (old_offset < 0)
return 0;
if (fseek(_fp, 0, SEEK_END))
return 0;
end_offset = ftell(_fp);
if (end_offset < 0)
return 0;
if (fseek(_fp, old_offset, SEEK_SET))
return 0;
return offset + length <= end_offset;
}

Мы просто в тексте вводим пространство имён, в данном случае patcher, и оно у нас стоит во всех методах исполнителя, символизируя о том, что метод относится к нему. Тот же принцип применён в GTK (он на C сделан).

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



Отредактировано py.user.next (Дек. 4, 2018 09:42:16)

Офлайн

#3 Дек. 4, 2018 09:45:17

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

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

Вот это могло бы иметь смысл, но это не оч соответствует идеологии Python.

В python большое количество синтаксического сахара, например, тот же self.do_something() автоматически преобразуется в do_something(self). Так что никакой идеалогии это не противоречит.

Офлайн

#4 Дек. 4, 2018 09:53:25

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

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

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

Противоречивая мысль, потому что в С компилятор анализирует не только совпадение имен функций, но и имен констант / переменных. Тогда второе тоже должно не волновать. Причем, что самое смешное в коде есть переменная модуля:
static FILE *_fp;

Если вспомнить, что функция в python- это переменная, то все становится еще смешнее.

Вы уж определитесь так ли страшно, что в python- коде могут пересекаться названия констант / переменных или нет (при учете, что пересечение имен функций не важно).

Офлайн

#5 Дек. 4, 2018 10:08:53

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

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

AlekseyPython
в С компилятор анализирует не только совпадение имен функций, но и имен констант / переменных
Константы пишутся в верхнем регистре. Почему? Потому что они тогда хорошо читаются как константы*. Можно написать их в CamelCase, но обычно это делается в перечислении enum, которое может быть изолировано в локальной области видимости. То есть за пределами этой области видимости эти константы не будут видны. Переменные в глобальной области? Ну, а зачем они нужны? Максимум, что можно делать, - это запирать переменную в модуле через static. Тогда в остальной части программы она не видна. При этом имена внутри модуля полностью контролируются. Ещё, к тому же, есть файл .h, в котором также написаны имена, которые можно быстро прочитать и увидеть сразу, есть ли там совпадения.

* В питоне, кстати, тоже это принято. Если модуль re откроешь, то флажки для режимов парсинга как раз в верхнем регистре сделаны.



Отредактировано py.user.next (Дек. 4, 2018 10:11:25)

Офлайн

#6 Дек. 4, 2018 10:13:18

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

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

JOHN_16
ервая конструктивная мысль за весь тред от Вас.

Мысль перестанет быть конструктивной, если вспомнить, что в питоне класс и объект вполне может быть результатом работы метода другого класса, то есть иметь в себе замыкания, и сиё мероприятие вовсю юзается в питоне в виде, например, декораторов.

 debug = True
   
class Base:
    pass
   
def service(name):
    def decorator(cls):
        return _ServiceLocator(cls, name)
    return decorator
   
class _ServiceLocator:
  
    __instances = {}
  
    def __init__(self, cls, name):
        self.cls = cls
        self.name = name
  
        if debug:
            def _locator(this):              # FUCK!!!
                if isinstance(this, Base): #BABAM!!!!!!!!
                    return self                 #BUBUH!!!!!
                return None
        else:
            def _locator(this):
                raise NotImplemented()
   
        cls._locator = _locator
   
    def __call__(self, *args, **kwargs):
        if self.name in self.__instances:
            return self.__instances[self.name]
  
        instance = self.cls(*args, **kwargs)
        self.__instances[self.name] = instance
        return instance
  
    @classmethod
    def get_instance(cls, name):
        return cls.__instances[name]
   
@service("FooService")
class Foo(Base):
    pass
   
f = Foo()
print f._locator()



Офлайн

#7 Дек. 4, 2018 10:21:57

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

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

Класс является пространством имён для своих констант. Ты вообще понимаешь, что в разных классах могут быть константы с одинаковыми именами, но с разными значениями?

Тоже самое можно сказать про функции. Почему за константы боимся, а за функции нет? Тогда получается и все функции надо оборачивать классами, чтобы не было пересичения имен.

То ты теряешь модульный функционал.

Второй раз напишу: я ничего не объединяю в пакеты и не создаю компоненты.

Отредактировано AlekseyPython (Дек. 4, 2018 10:30:03)

Офлайн

#8 Дек. 4, 2018 10:29:44

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

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

Мысль перестанет быть конструктивной, если вспомнить, что в питоне класс и объект вполне может быть результатом работы метода другого класса, то есть иметь в себе замыкания, и сиё мероприятие вовсю юзается в питоне в виде, например, декораторов.

Прямо анализатор кода такое тупой, что не может распознать использование декоратора (перед функцией) и обращение к полям экземпляра класса (перед переменной). В остальных местах повсеместно одни и теже символы используются для разных действий (в зависимости от контекста), а тут обязательно случаться #FUCK!!!, #BABAM!!!!!!!! и #BUBUH!!!!!

В крайнем случае пусть это будет знак $ или &.

Офлайн

#9 Дек. 4, 2018 10:35:17

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

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

AlekseyPython
В крайнем случае пусть это будет знак $ или &.
Этак тебе алфавита не хватит

AlekseyPython
Так, а теперь спрятали калькуляторы и достали двойные листочки. Ты, Алексей, вообще-то понимаешь, что такое замыкание и в чем его смысл? Ну-ка объясни дяде.



Офлайн

#10 Дек. 4, 2018 10:47:31

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

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

Ну-ка объясни дяде.
Это вы к своей жене так обращайтесь.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version