Python全局对象缓存

4 投票
2 回答
4524 浏览
提问于 2025-04-16 05:14

我有个小问题,关于应用程序的架构:

我有一个Python脚本,它作为一个后台程序在运行。

在这个脚本里,我有很多对象,它们都是从一个类(我们叫它“实体”)继承而来的。

我还有一个主要的对象,叫它“顶层系统”。

这些实体通过一对(id,类型(大致上就是类))来识别,并且它们之间有很多复杂的连接。它们也会不断被创建和删除,并且需要访问其他实体。

所以,我需要一种存储方式,基本上就是一个字典的字典(每种类型一个),用来保存所有的实体。

我的问题是,应该把这个字典作为“顶层系统”的一个属性,还是作为“实体”类的一个属性呢?我倾向于第二种方式(这样实体就不需要知道“顶层系统”的存在),但我对直接在类中使用属性有点不太放心。或者说,也许还有其他的解决办法?

2 个回答

0

在类上使用属性是没有问题的。类其实也是对象。

根据你提供的信息,我也会选择使用类属性,因为这样可以避免创建依赖关系,这样将来就能少担心一些事情。

6

这里的细节不够多,没法确定最好的做法,但一般来说,我会把实际的对象注册表存储为一个模块级别的(全局)变量,放在最上面的类里,并在基类中提供一个方法来访问它。

_entities = []
class entity(object):
    @staticmethod
    def get_entity_registry(): 
         return _entities

另外,你也可以完全隐藏 _entities,只暴露几个方法,比如 get_object_by_idregister_object,这样以后如果想更改 _entities 的存储方式会更方便。

顺便提个小建议,如果你还没注意到的话:在创建这样的对象注册表时,可能需要了解一下 弱引用(weakrefs)

撰写回答