首页 > 解决方案 > 如何在保留相同签名的同时向对象动态添加方法?

问题描述

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

我将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)>

标签: pythondynamicparameterssignatureinspect

解决方案


方法是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


推荐阅读