gpt4 book ai didi

python - 如何从静态方法创建类的实例?

转载 作者:行者123 更新时间:2023-11-28 22:07:14 27 4
gpt4 key购买 nike

这是我的问题。我创建了一个非常繁重的只读类,使用静态“工厂”方法进行许多数据库调用。此方法的目标是如果同一对象(相同类型、相同初始参数)的相同实例已存在,则通过查看已创建对象池来避免杀死数据库。

如果找到了什么,该方法将返回它。没问题。但如果不是,我如何以一种与继承一起工作的方式创建对象的实例?

>>> class A(Object):
>>> @classmethod
>>> def get_cached_obj(self, some_identifier):
>>> # Should do something like `return A(idenfier)`, but in a way that works

>>> class B(A):
>>> pass

>>> A.get_cached_obj('foo') # Should do the same as A('foo')
>>> A().get_cached_obj('foo') # Should do the same as A('foo')
>>> B.get_cached_obj('bar') # Should do the same as B('bar')
>>> B().get_cached_obj('bar') # Should do the same as B('bar')

谢谢。

最佳答案

import weakref

class A(object):
_get_obj_cache = weakref.WeakValueDictionary()
@classmethod
def get_obj(cls, identifier):
cache = cls._get_obj_cache
obj = cache.get((cls, identifier))
if obj is None:
obj = cache[(cls, identifier)] = cls(identifier)
return obj

class B(A):
pass

因为使用了 WeakValueDictionary,只要您有任何其他对它们的引用,对象就会保持缓存状态,您可以调用 SomeClass.get_obj(identifier) 作为多次获得相同的对象。如果我没听错的话,就是 cls(identifier) 会访问数据库,而这正是您希望较少调用的内容(因为您知道对象是不可变的。)

如果您希望将对象保留在缓存中,即使它们不再在别处被引用,则将 WeakValueDictionary 更改为普通字典。

这要求 identifier 适合字典键,如果它是一个字符串(正如您在示例代码中所具有的那样),那么它就是。

关于python - 如何从静态方法创建类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2426690/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com