Форум сайта python.su
221
AlekseyPythonпервая конструктивная мысль за весь тред от Вас.
И да, в других языках, например, в Ruby уже придумали замену ‘self.’ на @
Офлайн
857
AlekseyPythonУ меня на C программы есть. Вот как ты думаешь, как я их делаю? При этом там нет классов и пространств имён нет.
Но в этом случае имена функций также будут пересекаться и “перебивать” друг друга.
#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
#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;
}
Отредактировано py.user.next (Дек. 4, 2018 09:42:16)
Офлайн
0
Вот это могло бы иметь смысл, но это не оч соответствует идеологии Python.
Офлайн
0
Так что для меня функции в одном модуле не страшны, так как у меня сишник - первый язык.
static FILE *_fp;
Офлайн
857
AlekseyPythonКонстанты пишутся в верхнем регистре. Почему? Потому что они тогда хорошо читаются как константы*. Можно написать их в CamelCase, но обычно это делается в перечислении enum, которое может быть изолировано в локальной области видимости. То есть за пределами этой области видимости эти константы не будут видны. Переменные в глобальной области? Ну, а зачем они нужны? Максимум, что можно делать, - это запирать переменную в модуле через static. Тогда в остальной части программы она не видна. При этом имена внутри модуля полностью контролируются. Ещё, к тому же, есть файл .h, в котором также написаны имена, которые можно быстро прочитать и увидеть сразу, есть ли там совпадения.
в С компилятор анализирует не только совпадение имен функций, но и имен констант / переменных
Отредактировано py.user.next (Дек. 4, 2018 10:11:25)
Офлайн
568
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()
Офлайн
0
Класс является пространством имён для своих констант. Ты вообще понимаешь, что в разных классах могут быть константы с одинаковыми именами, но с разными значениями?
То ты теряешь модульный функционал.
Отредактировано AlekseyPython (Дек. 4, 2018 10:30:03)
Офлайн
0
Мысль перестанет быть конструктивной, если вспомнить, что в питоне класс и объект вполне может быть результатом работы метода другого класса, то есть иметь в себе замыкания, и сиё мероприятие вовсю юзается в питоне в виде, например, декораторов.
Офлайн
568
AlekseyPythonЭтак тебе алфавита не хватит
В крайнем случае пусть это будет знак $ или &.

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