类需频繁实例化时,将高开销语句放在静态类属性中是否不妥?
回答
pickle.load() 仅会在类定义完成时执行一次,对应到你的场景就是导入该类所在文件的时刻执行一次,后续无论实例化多少次MyClass,都不会重复触发这个高开销操作。
原因解释
Python类的构建逻辑是:解释器遇到class关键字声明类时,会先执行类缩进块内所有顶层(不嵌套在类方法、条件判断等内部代码块里的)语句,收集这些语句生成的变量绑定,作为类的属性存到类的命名空间里。
你写的my_variable = pickle.load(open("my_file.p", "rb"))属于类体顶层语句:
- 模块首次被导入时,Python会执行模块内所有顶层代码,走到
MyClass类定义块时就会执行这行加载逻辑,把反序列化得到的对象绑定为MyClass.my_variable类属性,整个进程生命周期里这一步只跑一次。 - 实例化类时只会执行
__init__等实例方法的逻辑,不会重新执行类体的顶层赋值代码,所有实例默认共享同一个类属性my_variable,不会重复读文件、反序列化。
额外提醒
- 你当前的写法没有显式关闭打开的文件句柄,存在资源泄漏隐患,推荐用上下文管理器改写类属性的加载逻辑:
class MyClass: with open("my_file.p", "rb") as _f: my_variable = pickle.load(_f) def __init__(self): # 你的初始化逻辑 pass - 因为
my_variable是类属性,所有实例访问到的都是同一个对象:如果加载出来的是可变类型(列表、字典、自定义类实例等),在某一个实例中修改这个对象的内容,会导致所有实例访问到的值都发生变化。如果需要每个实例持有独立的加载对象副本,需要在__init__方法中对MyClass.my_variable做深拷贝后绑定到实例属性上。
内容的提问来源于stack exchange,提问作者Grug
相关产品推荐
相关产品推荐

