覆盖`__setitem__`和`__getitem__`的正确方式



我正在尝试对dict进行子类化,但似乎无法使其工作:

class CacheManager(dict):
def __init__(self, *args):
dict.__init__(self, args)
self.log = ""
@property
def length(self):
return len(self)
@staticmethod
def do_log(message:str):
now = datetime.utcnow().strftime("%d-%b %H-%M-%S")
template = f"[{now}] {message}n"
return template

def __setitem__(self, key, value):
self.log += self.do_log(f"SET `{key}` with value `{value}`")
return dict.__setitem__(key, value)

def __getitem__(self, key):
self.log += self.do_log(f"GET `{key}` with value `{self.__getitem__(key)}`")
return dict.__getitem__(key)
cache = CacheManager()
cache["key"] = "value"
cache["key"]

然而,这会返回:TypeError: descriptor '__setitem__' requires a 'dict' object but received a 'str'

我认为这与self.log有关,但有什么方法可以做到这一点而不会出错吗?

您忘记将self传递给dict.__setitem__。你可以隐含地做

super().__setitem__(key, value)

或显式

dict.__setitem__(self, key, value)

__getitem__也是如此。

最新更新