如何在保留相同签名的同时动态地向对象添加方法?

How to dynamically add method to object while preserving the same signature?

我只是想将一个对象的所有成员变量和方法复制到另一个对象中。

我对成员变量使用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)>

方法是它们绑定到的 class 的属性,也是 inspect 查找它们的地方。这意味着您必须将它们从 Source class 复制到 Dest class.当您这样做时,它们当然会自动具有相同的签名。

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