类方法项分配

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

【讨论】:

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

将类变量作为默认值分配给类方法参数

将“活动”类分配给 EmberJS 中的选定列表项

如何将小部件连接到在一个类中声明的自定义信号,同时在另一个类中

有啥方法可以防止类的动态分配?

java 类方法和实例方法 以及 类变量和实例变量

类方法与实例方法的区别与使用