Python functools lru_cache с методами класса: выпуск объекта

Как я могу использовать lru_cache от functools внутри классов без утечки памяти? В следующем минимальном примереfoo экземпляр не будет выпущен, хотя выходит из области видимости и не имеет реферера (кроме lru_cache).

from functools import lru_cache
class BigClass:
    pass
class Foo:
    def __init__(self):
        self.big = BigClass()
    @lru_cache(maxsize=16)
    def cached_method(self, x):
        return x + 5

def fun():
    foo = Foo()
    print(foo.cached_method(10))
    print(foo.cached_method(10)) # use cache
    return 'something'

fun()

Ноfoo и поэтомуfoo.big (аBigClass) еще живы

import gc; gc.collect()  # collect garbage
len([obj for obj in gc.get_objects() if isinstance(obj, Foo)]) # is 1

Это означает, что экземпляры Foo / BigClass все еще находятся в памяти. Даже удаляяFoo (дельFoo) не выпустит их.

Почему lru_cache держится за экземпляр вообще? Разве кеш не использует какой-то хеш, а не реальный объект?

Каков рекомендуемый способ использования lru_caches внутри классов?

Я знаю два обходных пути:Использовать кэши для каждого экземпляра или жезаставить кеш игнорировать объект (что может привести к неправильным результатам, хотя)

Ответы на вопрос(1)

Ваш ответ на вопрос