Как динамически добавлять метод к объекту, сохраняя при этом ту же подпись?

#python #dynamic #parameters #signature #inspect

Вопрос:

Я просто хочу скопировать все переменные-члены и метод одного объекта в другой.

Я использую setattr() функцию для переменных-членов и types.MethodType для метода, но в этом случае скопированная функция ничего inspect.signature не содержит .

Я тоже хочу скопировать список параметров. Как я могу это сделать?

Я приведу пример ниже:

 import inspect

class source:
  def func1(self, a: str, b: int):
    print(a, "%d"%b)

class dest:
  pass

s = source()
d = dest()

# copy s -> d

inspect.signature(d.func1)
# -> Out: <Signature (a:str, b:int)>
 

Ответ №1:

Методы являются атрибутами class того, к чему они привязаны, и именно там inspect их ищут. Это означает, что вы должны скопировать их из Source класса в Dest класс. Когда вы сделаете это таким образом, они оба, конечно, автоматически будут иметь одну и ту же подпись.

 import inspect

class Source:
    def func1(self, a: str, b: int):
        print(a, "%d"%b)

class Dest:
    pass

s = Source()
d = Dest()

print(inspect.signature(s.func1))  # -> (self, a: str, b: int)
setattr(type(d), 'func1', Source.func1)
print(inspect.signature(d.func1))  # -> (self, a: str, b: int)
d.func1('ans', 42)  # -> ans 42

 

Комментарии:

1. спасибо вам за ответ. я проверяю, работает ли этот код.