类方法项分配

Posted

技术标签:

【中文标题】类方法项分配【英文标题】:Classmethod Item Assignment 【发布时间】:2014-06-03 11:13: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')

我在这里做错了什么会阻止第一个示例工作吗?有什么办法可以解决这个问题吗?

【问题讨论】:

特殊方法在type上查找;如果你创建了一个元类,这一切都有效。 见docs.python.org/2/reference/… 【参考方案1】:

要获得能够做到的行为:

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

【讨论】:

以上是关于类方法项分配的主要内容,如果未能解决你的问题,请参考以下文章