类方法项赋值

1 投票
1 回答
968 浏览
提问于 2025-04-18 03:19

我基本上创建了一个字典类,这个类使用类方法来实现所有的魔法方法,代码大概是这样的:

class ClassDict(object):
    _items = {}

    @classmethod
    def __getitem__(cls, key):
        return cls._items[key]

    @classmethod
    def __setitem__(cls, key, val):
        cls._items[key] = val

    @classmethod
    def __len__(cls):
        return len(cls._items)

    @classmethod
    def __delitem__(cls, key):
        cls._items.__delitem__(key)

    @classmethod
    def __iter__(cls):
        return iter(cls._items)

然后,当我尝试给它赋值的时候:

ClassDict['item'] = 'test'

我收到了一个错误提示,内容是 TypeError: 'type' object does not support item assignment,但是如果我直接调用实际的方法 __setitem__,像这样就可以正常工作:

ClassDict.__setitem__('item', 'test')

而且这样也可以:

ClassDict().__setitem__('item', 'test')

我这里是不是做错了什么,导致第一个例子不能正常工作?有没有什么办法可以解决这个问题?

1 个回答

0

为了实现我想要的功能,也就是能够做到:

ClassDict['item'] = 'test'

我需要像Martijn提到的那样,把这些特殊方法作为元类来实现。

所以我最后的实现代码是这样的:

class MetaClassDict(type):
    _items = {}

    @classmethod
    def __getitem__(cls, key):
        return cls._items[key]

    @classmethod
    def __setitem__(cls, key, val):
        cls._items[key] = val

    @classmethod
    def __len__(cls):
        return len(cls._items)

    @classmethod
    def __delitem__(cls, key):
        cls._items.__delitem__(key)

    @classmethod
    def __iter__(cls):
        return iter(cls._items)


class ClassDict(object):
    __metaclass__ = MetaClassDict

撰写回答