【发布时间】:2013-03-17 16:59:34
【问题描述】:
出于缓存/持久性的原因,我希望为基类的任意大的子类树(永远不会自行创建)获取唯一的可哈希地址。以下是目前的情况:
OBJECT_CACHE = dict()
class Base(object):
def __new__(cls, *args, **kwargs):
# calculate class_addr here?
obj = OBJECT_CACHE.get(class_addr)
if obj is None:
obj = super(Base, cls).__new__(cls, *args, **kwargs)
OBJECT_CACHE[class_addr] = obj
return obj
但我不确定获得这样一个 id 的最佳方法是什么。我的概念是它看起来像下面这样:
Base: # no id
F # id = 'f'
A: # id = 'a'
E # id = 'a.e'
B: # id = 'a.b'
C # id = 'a.b.c'
D # id = 'a.b.d'
我曾考虑尝试使用属性和super(),但理想情况下,子类将只包含像my_id = 'e' 这样的单行。提前致谢!
【问题讨论】:
-
为什么不直接使用类对象本身呢?
-
@delnan 如果我明白你的意思,主要是因为默认哈希值与对象内存地址相关联——如果脚本停止并重新启动,这会改变。 (
OBJECT_CACHE可以腌制保存) -
不,它存储类名和模块名,并检索存储在具有该标识符的该名称的模块中的任何内容。试试看:
class C(object): pass后跟import pickle; s = pickle.dumps({C: 1}); C = 'foo'; print pickle.loads(s) -
啊,好点子。我确实希望能够引用我注意到的符号中的对象(我最终没有使用 class.__name__,而是使用不同的属性)
标签: python oop inheritance