2013-05-14 105 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