2015-05-04 2 views
0

У меня есть класс `Collection», который выглядит следующим образом:как получить экземпляры классов из Dict в питоне

class Collection(): 

    def __init__(self, db, collection_name): 
     self.db = db 
     self.collection_name = collection_name 

     if not hasattr(self.__class__, 'client'): 
      self.__class__.client = MongoClient() 

     self.data_base = getattr(self.client, self.db) 
     self.collection = getattr(self.data_base, self.collection_name) 

    def getCollectionKeys(self): 
    ....etc. 

Я ловко создал функцию для создания словаря экземпляров класса следующим образом:

def getCollections(): 
    collections_dict = {} 
    for i in range(len(db_collection_names)): 
     collections_dict[db_collection_names[i]] = Collection(database_name, db_collection_names[i]) 
    return collections_dict 

Это работает. Однако, всякий раз, когда я хочу, чтобы получить доступ к экземпляру класса, я должен идти по словарю:

agents_keys = collections_dict['agents'].getCollectionKeys() 

Я хотел бы просто написать:

agents_keys = agents.getCollectionKeys() 

Есть простой способ, чтобы получить эти экземпляры " из "диктата"?

+2

'agents = collections_dict ['agents']'? – RafaelC

+0

@ RafaelCardoso есть способ запустить это для всех элементов dict, поэтому мне не нужно вводить их отдельно? – dwstein

ответ

1

Вы можете получить ссылку на элементы в словаре ванильного питона с использованием объекта-генератора в цикле for или с помощью выражения списка.

agent_keys = [x.getCollectionKeys() for x in collections_dict.values()]  

или это

agent_keys = [] 
for name in db_collection_names: 
    #do something with individual item 
    #there could also be some logic here about which keys to append 
    agent_keys.append(collections_dict[name].getCollectionKeys()) 

#now agent_keys is full of all the keys 


Моя ментальная модель того, как объекты взаимодействуют с в питона. Не стесняйтесь редактировать, если вы действительно знаете, как это работает.

Вы не можете «взять» элементы словаря на говорят, если вы не вызываете del оператор, который снимает объединение имени переменной (то есть то, что вы вводите в редакторе, как «Foo "и" bar ") с объектом (фактические коллекции бит в программе, которую видит ваш компьютер). Что вы можете сделать, так это получить ссылку на объект, который в python является символом, который для всех ваших целей и целей - объект, который вы хотите.

Словарь просто содержит кучу ссылок на объекты вашей базы данных. Выражение collections_dict['agents'] эквивалентно исходному объекту базы данных, который вы положили в словарь как этот collections_dict['agents'] = my_particular_object

+0

значения 'collections_dict' являются экземплярами' Collection', ваш 'individual_item' содержит как ключ, так и значение – haifzhan

+0

@haifzhan. Я перевернул их в голову, спасибо за уловку. Если вы видите такие плохие ошибки, не стесняйтесь редактировать. – Karl

+0

плюс 1 для вашего обновления. – haifzhan

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