所以我基本上创建了一个字典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')
我在这里做错了什么会妨碍第一个例子的运作?有什么办法可以解决这个问题吗?
答案 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