如何在保留相同签名的同时动态地向对象添加方法?
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
我只是想将一个对象的所有成员变量和方法复制到另一个对象中。
我对成员变量使用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