генерацией класса? Возникла идея сделать класс-прослойку между клиентом и сервером. Класс тянет с сервера список функций и динамически генерирует класс на основе этого списка. Функции подменяется вызовом к серверу, обратно, в качестве результата функции прилетает выдаётся ответ от сервера. В итоге у меня вышло такое:
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
Реально ли такую штуку соорудить?
Тут загвоздка не в создании класса, а в генерации методов внутри класса при его создании.
класс должен генерить класс с функциями которые стали методами ?
Ну вы же должны как-то передавать код функции
а стоп . может он берет функцию , и вызывает ее в методе тупо делигируя нужные параметры?
тип того. Код который я скинул, работает. Но в итоге получается: <bound method client._exec of <class 'main.client'>> <bound method client._exec of <class 'main.client'>> То бишь все новые имена просто ссылки на _exec, а не самостоятельные методы. А хочется сделать самостоятельный.
Если интересно, я таки раскурил ту наркоманию, которую хотел сделать. Финальный код выглядит так: 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"))
Ответ будет такой: 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') 🥳🥳🥳
Чем тебя __getattr__ не устраивает?
для какого куска?
Вместо сетаттра и статик функции
ммм, setarr у меня назначает методы в класс. А getattr берёт значения из класса. Не улавливаю как одно заменит другое пока что.
Не обязательно устанавливать, можно просто возвращать по запросу
По запросу метод генерить? А как?
Обсуждают сегодня