这是我的问题。我创建了一个相当重的只读类,使用静态“工厂”方法进行许多数据库调用。此方法的目标是,如果同一对象的相同实例(相同类型、相同初始化参数)已存在,则通过查找已创建的对象池来避免杀死数据库。
如果发现某些内容,该方法将返回它。没问题。但如果没有,我如何以继承的方式创建对象的实例?
>>> 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')
Run Code Online (Sandbox Code Playgroud)
谢谢。
小智 5
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
Run Code Online (Sandbox Code Playgroud)
因为使用了 a WeakValueDictionary,所以只要您有任何其他对它们的引用,这些对象就会保持缓存状态,并且您可以调用SomeClass.get_obj(identifier)任意多次来获取同一对象。如果我没理解错的话,那就是cls(identifier)访问数据库,这就是您想要较少调用的内容(因为您知道对象是不可变的。)
如果您想将对象保留在缓存中,即使它们不再在其他地方引用,则更改WeakValueDictionary为普通字典。
这要求标识符适合字典键,如果它是字符串(如示例代码中所示),那么它就是字符串。
| 归档时间: |
|
| 查看次数: |
4658 次 |
| 最近记录: |