#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. спасибо вам за ответ. я проверяю, работает ли этот код.