170 похожих чатов

Всем привет! Есть вопрос: сталкивался ли кто-нибудь вплотную с динамической

генерацией класса? Возникла идея сделать класс-прослойку между клиентом и сервером. Класс тянет с сервера список функций и динамически генерирует класс на основе этого списка. Функции подменяется вызовом к серверу, обратно, в качестве результата функции прилетает выдаётся ответ от сервера. В итоге у меня вышло такое:

class client():
def _get_server_command_list(self):
#Get commands list from server here
return ["stuff1", "stuff2"]
def _exec(self):
command = self._exec.__func__.name
return f"server_answer for command {command}"
def __init__(self, *args, **kwargs):
commands = self._get_server_command_list()
for command in commands:
setattr(self.__class__, command, staticmethod(self._exec))
setattr(getattr(self.__class__, command).__func__, 'name', command)
if __name__ == '__main__':
do = client()
print(do.stuff1())
print(do.stuff2())

Но не взлетает из-за того, что func, 'name' выходит один на всех. Ответ будет:
server_answer for command stuff2
server_answer for command stuff2

Реально ли такую штуку соорудить?

14 ответов

18 просмотров
Nikolay- Автор вопроса

Тут загвоздка не в создании класса, а в генерации методов внутри класса при его создании.

класс должен генерить класс с функциями которые стали методами ?

Nikolay
Тут загвоздка не в создании класса, а в генерации ...

Ну вы же должны как-то передавать код функции

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

Nikolay- Автор вопроса
Elysium ㅤ
а стоп . может он берет функцию , и вызывает ее в...

тип того. Код который я скинул, работает. Но в итоге получается: <bound method client._exec of <class 'main.client'>> <bound method client._exec of <class 'main.client'>> То бишь все новые имена просто ссылки на _exec, а не самостоятельные методы. А хочется сделать самостоятельный.

Nikolay- Автор вопроса

Если интересно, я таки раскурил ту наркоманию, которую хотел сделать. Финальный код выглядит так: import types from functools import partial class client(): def _get_server_command_list(self): #Get commands list from server here return ["stuff1", "stuff2"] @staticmethod def mkfunc(name): def func(name, *args): return f"server_answer for command {name} with params: {args}" func.__name__ = name return func def __init__(self, *args, **kwargs): commands = self._get_server_command_list() for command in commands: f1 = self.mkfunc(command) f2 = partial(f1, command) setattr(self.__class__, command, staticmethod(f2)) if __name__ == '__main__': do = client() print(do.stuff1(123)) print(do.stuff2(456)) print(do.stuff2("test", "assas"))

Nikolay- Автор вопроса

Ответ будет такой: server_answer for command stuff1 with params: (123,) server_answer for command stuff2 with params: (456,) server_answer for command stuff2 with params: ('test', 'assas') 🥳🥳🥳

Nikolay- Автор вопроса
Nikolay
для какого куска?

Вместо сетаттра и статик функции

Nikolay- Автор вопроса
Tishka17
Вместо сетаттра и статик функции

ммм, setarr у меня назначает методы в класс. А getattr берёт значения из класса. Не улавливаю как одно заменит другое пока что.

Nikolay
ммм, setarr у меня назначает методы в класс. А get...

Не обязательно устанавливать, можно просто возвращать по запросу

Nikolay- Автор вопроса

Похожие вопросы

Обсуждают сегодня

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Мужики. привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных элементов...
Kraszx
2
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Всем привет! Кто пользуется DevExpress, подскажите пожалуйста, реализован ли в TcxGrid в новых версиях поиск по датам как в Экселе (ну т.е. не просто список чекбоксов со значе...
A Z
4
Карта сайта