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 (идентификатор) столько раз, сколько захотите, чтобы получить тот же объект. Если я вас правильно понял, это cls(identifier)
, который попадет в базу данных и то, что вы хотите вызывать реже, поскольку вы знаете, что объекты неизменны.
Если вы хотите сохранить объекты в кэше, даже если на них больше нет ссылок в другом месте, измените WeakValueDictionary на обычный dict.
Для этого требуется, чтобы идентификатор подходил для ключа dict, и если это строка, как у вас в коде примера, то это так.