2013-05-14 3 views
-1

Простые объяснения примерами будут делать то, где 3 из них не могут быть взаимозаменяемы.Python: различия между __setitem__; setattr; set

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

Может вышеописанный шаг сделать в итераций с SetAttr (объект, вал [может опционально вещи приходят сюда ??])

Почему бы просто не создать свой собственный стиль и частные методы?

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) 

Если вы хотите расширить все сразу за один вызов, вы можете создать что-то вроде .update() метода dict «s, который принимает итератор и/или аргументы ключевого слова:

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

+0

@ user2290820 Я думаю, что расширение должно быть в порядке, но вы должны повиноваться, что используется правильная семантика: что должно произойти, если вы выполняете 'my_object [key] = something'. – glglgl

+0

, потому что я хочу перейти к текущему списку, а не перезаписывать или заменять существующие. Он пытается найти способ динамически добавлять атрибуты. Есть ли способ? – user2290820

Смежные вопросы