如何获取Python中创建实例时所用的初始化参数及值?
解决方法
方法1:直接修改__init__存储参数
最直接的方案是在MyClass的初始化方法里,把传入的delay参数赋值给实例属性,后续就能直接通过实例访问:
class MyClass: def __init__(self, delay): self.delay = delay # 新增该行,将参数存入实例 self.myparam = MyOtherClass(delay) instance = MyClass(delay=2) print(instance.delay) # 输出:2
参数名可通过你之前使用的inspect.signature(instance.__init__)获取。
方法2:用装饰器自动记录初始化参数
如果不想改动原类的核心逻辑,可以用装饰器捕获并存储__init__的调用参数:
import inspect def track_init_args(cls): original_init = cls.__init__ def new_init(self, *args, **kwargs): # 绑定参数到方法签名 sig = inspect.signature(original_init) bound_args = sig.bind(self, *args, **kwargs) bound_args.apply_defaults() # 剔除self后,将参数存入实例属性 self.__init_args__ = {k: v for k, v in bound_args.arguments.items() if k != 'self'} original_init(self, *args, **kwargs) cls.__init__ = new_init return cls # 为MyClass添加装饰器 @track_init_args class MyClass: def __init__(self, delay): self.myparam = MyOtherClass(delay) class MyOtherClass: def __init__(self, delay): pass instance = MyClass(delay=2) print(instance.__init_args__) # 输出:{'delay': 2}
这种方式无需修改原__init__的业务代码,就能完整获取初始化时的参数名和对应值。
方法3:通过调用栈回溯获取(仅作调试参考)
可以借助inspect模块解析调用栈,获取实例化时的参数,但这种方法依赖调用上下文,稳定性较差,仅适合临时调试:
import inspect class MyClass: def __init__(self, delay): # 获取上一层调用帧(即实例化MyClass的代码所在帧) frame = inspect.currentframe().f_back # 解析帧中的局部变量,提取参数 args_info = inspect.getargvalues(frame) self.init_args = {k: v for k, v in args_info.locals.items() if k != 'self'} self.myparam = MyOtherClass(delay) class MyOtherClass: def __init__(self, delay): pass instance = MyClass(delay=2) print(instance.init_args) # 输出:{'delay': 2}
内容的提问来源于stack exchange,提问作者Michelle Fernández
相关产品推荐
相关产品推荐

