首页 > 解决方案 > 如何在不混乱接口的情况下共享对象的单个实例?

问题描述

我正在编写一个依赖于重量级对象的类。我的类的每个实例都可以共享同一个重量级对象——为了提高效率,我只是想避免复制它。

最简单的解决方案是实例化重量级对象并将其手动传递给我的类的每个实例,但我认为这会导致接口臃肿和丑陋的代码,例如:

H = HeavyweightObject();
C1 = MyObject( H );
C2 = MyObject( H );

如果我有一个高级课程,它可能需要三到四个重量级项目,因此界面变得越来越难看。

如果我可以自动让我正在编写的类的每个实例自动共享重量级对象的同一个实例,我真的会更喜欢它。第一次实例化 MyObject 时,它可以运行一些一次性代码来创建 HeavyweightObject 的实例,然后 MyObject 的每个后续实例都只使用同一个 HeavyweightObject 实例。我最初的想法(作为 C/C++ 程序员)是在编写 MyObject 时做这样的事情:

myobject.py:

H = None

class MyObject():
    def __init__( self ):
        if H == None:
            H = HeavyweightObject();
        self.H = H;

但我在这里遇到错误:

> if H == None:
UnboundLocalError: local variable 'H' referenced before assignment

我是 Python 新手,所以我不确定为什么会出现这个错误,我什至不知道这种方法是否真的能达到我想要的效果。

标签: python

解决方案


你真的很亲近。在__init__类方法上使用时,需要将其作为参数传入。尝试这个:

class MyObject():
    def __init__( self, H=None ):
        if H is None:
            H = HeavyweightObject();
        self.H = H;

然后你可以这样称呼obj = MyObject(H=H)


推荐阅读