在Python 3.8中将lru_cache与类继承一起使用时出现TypeError

ct2axkht  于 2023-05-05  发布在  Python
关注(0)|答案(2)|浏览(125)

说明:我尝试使用functools模块中的lru_cache装饰器来缓存两个类A和B的示例,其中B继承自A。下面是我的代码:

from functools import lru_cache

@lru_cache(1)
class A:
    def __init__(self):
        pass

@lru_cache(1)
class B(A):
    pass

b = B()

但是,当我运行这段代码时,我得到以下错误:

TypeError: lru_cache() missing required argument 'cache_info_type' (pos 4)

我正在使用Python 3.8,我不知道为什么我会得到这个错误。谁能帮助我了解导致此错误的原因以及如何修复它?提前感谢您的帮助。
我尝试使用lru_cache装饰器来缓存两个类A和B的示例,其中B继承自A。我希望代码运行时没有错误,并为每个类创建一个示例,如果我创建了同一个类的另一个示例,则将缓存并重用该示例。然而,我遇到了一个TypeError,消息“lru_cache()missing required argument 'cache_info_type'(pos 4)”,这是我没有预料到的。我不知道为什么会发生这个错误,我正在寻求帮助,以了解错误的原因以及如何修复它。

mum43rcc

mum43rcc1#

我认为lru_cache可能不适用于class,因为class在创建后不会重新计算。您可以尝试重写__new__方法来实现您的需求。

class A:
    def __init__(self):
        pass

class B(A):
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

这也类似于单例模式

gab6jxml

gab6jxml2#

等你找到了

@lru_cache(1)
class A:
    def __init__(self):
        pass

A不是您定义的类。A是一个LRU缓存 Package 器。
当你这样做

@lru_cache(1)
class B(A):
    pass

你试图从 Package 器继承,而不是你定义的类。

相关问题