2013-05-14 65 views
-1

通过示例的简单解释可以在三个不能互换的地方进行。Python:__setitem__之间的差异; setattr;设置

def __setitem__(self,**k): 
     #self.val=k 
     for key in k: 
      self.val.setdefault(key,[]).extend(v for v in k[key]) 

,在上面的步骤反复进行与SETATTR(OBJ,VAL [,可选配的东西到这里来?])

为什么不只是创造我们自己的风格和私有方法?

def _add(self,**k): 
    if isinstance(self, CClass): 
     for key in k: 
      self.val.setdefault(key,[]).extend(v for v in k[key]) 

问:所有类的范围都允许访问和使用这些私有方法吗?

回答

1

__setitem__只能用于设置一个项目:

def __setitem__(self, key, value): 
    self.val.setdefault(key,[]).append(value) 

如果您更喜欢一次性延长一个电话,就可以建立类似dict.update()方法,它需要一个迭代和/或关键字参数:

def update(self, it, **k): 
    for key, val in it: 
     self.val.setdefault(key,[]).extend(v for v in val) 
    for key, val in k.iteritems(): 
     self.val.setdefault(key,[]).extend(v for v in val) 
+0

所以你的意思是我的第一个代码实际上并没有扩展,但附加的权利? – user2290820 2013-05-14 12:16:34

+0

@ user2290820我认为扩展应该是可以的,但是你应该服从使用正确的语义:如果你做'my_object [key] = something'会发生什么。 – glglgl 2013-05-14 12:24:58

+0

,因为我想扩展到当前列表,而不是覆盖或替换现有ones.im试图找到一种方法来动态添加属性。有没有办法? – user2290820 2013-05-14 13:39:07