类方法项分配
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
【讨论】:
以上是关于类方法项分配的主要内容,如果未能解决你的问题,请参考以下文章