【问题标题】: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')

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

【问题讨论】:

标签: python assignment-operator class-method


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-12-03
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多