类被删除时如何保留对象引用?实现Foo多次实例化复用首个A对象
解决Foo类复用首次创建的A对象问题
嘿,这个需求其实挺典型的——要让某个资源只初始化一次,后续所有实例都复用它对吧?咱们可以利用Python的类属性来实现,因为类属性是属于整个类的,所有实例共享,正好适配这种场景。
下面给你两种常用的实现方式:
方法一:在__init__中判断并初始化类属性
这是最直观的方式,在Foo的构造方法里检查类属性是否已经初始化,没初始化就创建A对象,之后直接复用:
class Foo: # 用下划线开头标记为内部属性,约定俗成不直接外部修改 _shared_a = None def __init__(self): # 第一次实例化时创建A对象 if Foo._shared_a is None: Foo._shared_a = A() # 把共享的a赋值给当前实例的属性 self.a = Foo._shared_a # b还是每次实例化都新创建,用共享的a的var self.b = B(self.a.var)
这样一来,不管你实例化多少次Foo,只有第一次会调用A()创建对象,后面所有Foo实例的self.a都是同一个对象。
方法二:在__new__中初始化类属性
如果你想把初始化逻辑放在实例创建的更早阶段,可以用__new__方法(它比__init__先执行,负责创建实例本身):
class Foo: _shared_a = None def __new__(cls, *args, **kwargs): # 类创建实例时先检查共享a是否存在 if cls._shared_a is None: cls._shared_a = A() # 调用父类的__new__创建实例 return super().__new__(cls, *args, **kwargs) def __init__(self): self.a = self._shared_a self.b = B(self.a.var)
效果和第一种完全一样,只是把初始化逻辑移到了实例创建的第一步,适合一些需要更早准备资源的场景。
注意事项
- 如果你的A对象是不可变类型或者不需要在后续操作中修改状态,这两种方法都完美适用;
- 如果A对象的状态会被某个Foo实例修改,那所有其他Foo实例都会看到修改后的状态,这是共享属性的特性,使用前要确认符合你的业务逻辑。
内容的提问来源于stack exchange,提问作者bgly
相关产品推荐
相关产品推荐

