类方法项目分配

时间:2014-04-18 21:28:12

标签: python assignment-operator class-method

所以我基本上创建了一个字典Class,它使用classmethods来实现所有类似的魔术方法:

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 :(得分:0)

获得所需的行为:

ClassDict['item'] = 'test'

我必须将特殊方法作为元类实现,而不是像Martijn所指出的那样。

所以我的最终实现如下:

class MetaClassDict(type):
    _items = {}

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

    @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