2015-10-04 3 views
2

Да! Я знаю, что вы не можете понять по названию.
Возьмите, например, нижеследующий код.
Defaultdict класса - Получить индекс/ключ текущего вызываемого экземпляра внутри класса

class Room(object): 
    def __init__(self): 
     self.numbers = [] 
     self.identify = None #for now? 
    def getRoom(self): 
     #here I need to implement so that, 
     # self.identify is current indent this class is called! 
     return self.identify 
room = defualtdict(Room) 
print room['Train'].getRoom() 
print room['Hospital'].getRoom() 

Исключенный выход.

#>>Train 
#>>Hospital 

Любая такая функция поддерживается в defaultdict, так что я могу это сделать? Когда класс класса «что-то» называется внутри класса, мне нужен код, так что self.room - это «нечто», которое называется!

+0

Вам нужно унаследовать от defaultdict, почему бы вам не требовать экземпляров экземпляров, как правило, зачем нужен dict? –

+0

@PadraicCunningham: Если вы видите приведенный выше код, вы можете легко поймать, почему мне нужно использовать Dict для этого класса! – user4673063

+0

Я понимаю из вашего кода почему, но есть намного более простые способы сделать это. –

ответ

4

Завод по умолчанию collections.defaultdict (любой вызываемый) не принимает аргументы.

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

Иными словами, defaultdict не передает никакой информации на адрес default_factory.

Подкласс defaultdict настроить параметр по умолчанию крюка, чтобы вызвать (конструктор класса Room) default_factory с отсутствующим ключом в качестве параметра:

Конструктор Room будет выглядеть

class Room(object): 
    def __init__(self, identity): 
     self.numbers = [] 
     self.identify = identity 

Вам нужно будет использовать mydefaultdict вместо defaultdict. Пример:

room = mydefaultdict(Room) 
print(room['Train'].getRoom()) # Train 
print(room['Hospital'].getRoom()) # Hospital 

В то время как это работает, я предлагаю вам пересмотреть способ хранения/доступа к данным.

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