我有从dict继承的子类。在__getitem__
方法上,我想检查密钥是否为数字。如果它是数字,我想实现一些其他行为,如果不是,那么我想像往常一样继续。例如:
class M(dict):
...
def __getitem__(self, key):
if self.isNumber(key):
print "I am number"
else:
# continue the same way as it would have done
...
>>> x = M({"name": "Tom", "surname": "Baker", "age": "55"})
>>> print x["name"]
Tom
>>> x[0]
I am number
我该怎么做?
更新
我知道dict中的项目是散列的,因此它不会有序,我所要求的原因是其他原因。因为我确定你仍会问为什么,这就是原因:dict是一个对象,我将通过索引检索与给定对象相关的对象。 (想想父母,孩子的东西)
答案 0 :(得分:2)
# continue the same way as it would have done
这里使用super()
函数。 (这不是开玩笑)
http://docs.python.org/library/functions.html#super
答案 1 :(得分:2)
不确定这是否是你要找的......
class M(dict):
def __getitem__(self, key):
try:
temp = int(key)
return "I am a number"
except ValueError:
return self.get(key, None)
item = M({'one':'1', 'two':'2', '3':'three'})
print item['one']
print item[3]
print item[0]
如@bpgergo所述,您也可以使用super
。
所以回报看起来像这样:
except ValueError:
return super(M, self).__getitem__(key)
这里最大的区别是我的方式(可能很差)抑制因为你试图访问不存在的密钥而引发的任何KeyError。
答案 2 :(得分:1)
为此,您需要在密钥不是数字的情况下调用父类的__getitem__
方法。这是通过super()函数完成的。请参阅以下示例:
class cls(dict):
def __getitem__(self, key):
if isinstance(numbers.Number):
print "I am a number"
else:
return super(cls, self).__getitem__(key)
答案 3 :(得分:-2)
您需要按字典键的列表进行索引。 例如:
x = dict({"name": "Tom", "surname": "Baker", "age": "55"})
print x[x.keys()[0]]
'55'
编辑:我怀疑,订单无法保证。
“键和值以任意顺序列出,非随机, 不同的Python实现,并取决于字典 插入和删除的历史。如果items(),keys(),values(), 使用no调用iteritems(),iterkeys()和itervalues() 对词典的干预修改,列表将直接进行 对应。这允许使用创建(值,键)对 zip():“pairs = zip(a.values(),a.keys())”。同样的关系 保持iterkeys()和itervalues()方法:“pairs = zip(a.itervalues(),a.iterkeys())“为对提供相同的值。 创建相同列表的另一种方法是“pair = [(v,k)for(k,v)in” a.iteritems()] “”
来源:http://docs.python.org/release/2.5.2/lib/typesmapping.html
考虑到这一点,我认为最好不要假设字典中的SLA(键的顺序不会改变)