如何获取Python对象通过__init__重建所需的必要变量?
解决方案
核心是用Python标准库的inspect模块获取类__init__方法的签名信息,以此过滤实例中仅属于初始化参数的变量,完全不需要修改原类。
实现代码
import inspect class Example: def __init__(self, z, x=1): self.x = x self.z = z # 临时变量,不需要保存 self.y = x + z def magic_get_data(obj): # 获取__init__方法的签名 sig = inspect.signature(obj.__class__.__init__) init_params = list(sig.parameters.keys())[1:] # 排除第一个参数self data = {} for param in init_params: # 优先取实例中已有的值,没有则用参数默认值 if param in obj.__dict__: data[param] = obj.__dict__[param] else: data[param] = sig.parameters[param].default return data def magic_make_from_data(cls, data): # 用提取的初始化参数重建实例 return cls(**data) # 测试代码 if __name__ == "__main__": original = Example(z=5) data = magic_get_data(original) reconstructed = magic_make_from_data(Example, data) # 比较两个实例的__dict__是否一致 print(original.__dict__ == reconstructed.__dict__) # 输出True
关键说明
inspect.signature能精准获取__init__的所有参数(包括默认值),不管参数是必填还是可选。magic_get_data只保留__init__定义的参数对应的变量,自动排除临时生成的y。magic_make_from_data直接用关键字参数传递初始化数据,确保重建的实例和原实例的状态完全一致。
内容的提问来源于stack exchange,提问作者coder
相关产品推荐
相关产品推荐

