2013-10-16 91 views
4

我这样做的Python:一类使用__getitem__和使用中发现,项目

class dumb(object): 
    def __init__(self): 
     self.g = {} 
    def __getitem__(self,key): return self.g[key] if key in self.g else None 
    def __setitem__(self,key,val): 
     self.g[key] = val 


te = dumb() 

te[1]=2 

te[1] 
Out[4]: 2 

1 in te 

和它挂..

所以,如果我想寻找这样的事情,我怎么去做?请不要告诉我子类字典的子类。

在此先感谢!

可能相关的问题在这里问: What does __contains__ do, what can call __contains__ function

+2

顺便说一下,挂的原因是,当没有'__contains__'方法可用,但有一个'__getitem__',它会尝试从0开始的所有可能的索引。由于'__getitem__'方法永远不会引发异常(它只返回None),所以它会一直尝试无限次。 (你可以在'__getitem__'方法中加入'print key'来确认这一点) –

+0

为什么你不想子类字典的任何特殊原因? – mbatchkarov

+0

@mbatchkarov因为它使用其他函数不是特定于字典,我不想限制它类的东西(类型1,类型2)和所有mro适合遵循这是反正不是这里的情况。在那里定义了许多方法。 – user2290820

回答

7

对于in正常工作,你需要重写__contains__()

class dumb(object): 
    ... 
    def __contains__(self, key): 
     return key in self.g 

顺便说一句,

self.g[key] if key in self.g else None 

可以更简洁书写为

self.g.get(key) 
+0

哇,一知道就知道。 – user2290820

3

为了能够做这样的事情:

1 in te 

你必须定义__contains__方法

class dumb(object): 
     def __init__(self): 
      self.g = {} 
     def __getitem__(self,key): return self.g[key] if key in self.g else None 

     def __setitem__(self,key,val): 
      self.g[key] = val 

     def __contains__(self, item): 
      return item in self.g 
+0

感谢这个例子。 – user2290820