d[x]
其中d
是一個字典,調用d.__getitem__(x)
。有沒有辦法創建一個類F
,這樣y=F(X); d[y]
會調用F
中的某種方法代替:y.someMethod(d)
?`__getitem ___'的反轉
背景:我試圖用「別名」鍵做一個字典,所以如果我有d[a]=42
,那麼d[alias_of_a]
也會返回42。這是自定義__getitem__
非常簡單,例如:
class oneOf(object):
def __init__(self, *keys):
self.keys = keys
class myDict(dict):
def __getitem__(self, item):
if isinstance(item, oneOf):
for k in item.keys:
if k in self:
return self[k]
return dict.__getitem__(self, item)
a = myDict({
'Alpha': 1,
'B': 2,
})
print a[oneOf('A', 'Alpha')]
print a[oneOf('B', 'Bravo')]
不過,我想知道是否可以在不重寫dict
可能:
a = {
'Alpha': 1,
'B': 2,
}
print a[???('A', 'Alpha')]
print a[???('B', 'Bravo')]
如果這是不可能的,如何使它的工作倒過來:
a = {
???('A', 'Alpha'): 1,
???('B', 'Bravo'): 2,
}
print a['A']
print a['Bravo']
什麼,重要的是我是我想避免延長dict
。
不,沒有這樣的方法。傳入'__getitem__'的對象不會被通知使用。 – 2014-09-22 11:39:16
您可以通過映射到規範值來使您的鍵等價*,然後使用'__eq__'和'__hash__'插入相同的字典哈希表插槽。但是那需要你有一個映射到規範的方法。 – 2014-09-22 11:41:12
您可能對[PEP-455](http://legacy.python.org/dev/peps/pep-0455/)感興趣,但尚未被接受但似乎適用於您的用例。 – chepner 2014-09-22 12:34:43