python - 如何在保留相同签名的同时向对象动态添加方法?
问题描述
我只想将一个对象的所有成员变量和方法复制到另一个。
我将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
推荐阅读
- gradle - 找不到名称为“类”的任务,即使很难我也可以运行它
- validation - 如何在 vee-validate 中指定自定义规则的优先级?
- python - 如何使用 SQLAlchemy 将远程 mySQL 数据库连接到烧瓶应用程序?
- python - 查找相似/同义词/上下文词 Python
- json - react-native-table-component 将 Json 数据导入表
- git - Git 凭证管理器和手动创建的 PAT
- flutter - Flutter Auth(BLoC 模式和 rxDart)
- angular - 如何在订阅中添加`map`运算符
- sql - Ignite: SQL query to calculate probability of a column
- server - Serverless 条件函数部署