python - 如何在不混乱接口的情况下共享对象的单个实例?
问题描述
我正在编写一个依赖于重量级对象的类。我的类的每个实例都可以共享同一个重量级对象——为了提高效率,我只是想避免复制它。
最简单的解决方案是实例化重量级对象并将其手动传递给我的类的每个实例,但我认为这会导致接口臃肿和丑陋的代码,例如:
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 新手,所以我不确定为什么会出现这个错误,我什至不知道这种方法是否真的能达到我想要的效果。
解决方案
你真的很亲近。在__init__
类方法上使用时,需要将其作为参数传入。尝试这个:
class MyObject():
def __init__( self, H=None ):
if H is None:
H = HeavyweightObject();
self.H = H;
然后你可以这样称呼obj = MyObject(H=H)
推荐阅读
- python - 如何发送密件抄送而不在电子邮件标题中显示密件抄送?
- java - JavaFX 客户端服务器套接字
- cmake - 使用 cmake 从源安装“darktable”时 WEBP 和 LENSFUN 出现问题
- python - 如何修复 NameError:未定义名称“policydict”
- sql - SQL Server:检查每个用户的重复外键(给定合成主键)
- javascript - JavaScript clearInterval 是异步的吗?
- css - 移动响应表
- python - 为什么 Flask 重定向到“GET /?HTTP/1.1”
- php - php替换标签中的最后一个空格
- c# - SQL Server 查找基础表