генерацией класса? Возникла идея сделать класс-прослойку между клиентом и сервером. Класс тянет с сервера список функций и динамически генерирует класс на основе этого списка. Функции подменяется вызовом к серверу, обратно, в качестве результата функции прилетает выдаётся ответ от сервера. В итоге у меня вышло такое:
                  
                  
                  
                  
                  
                  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 берёт значения из класса. Не улавливаю как одно заменит другое пока что.
Не обязательно устанавливать, можно просто возвращать по запросу
По запросу метод генерить? А как?
Обсуждают сегодня