Смущает само ["name"] = имя файла - PullRequest
3 голосов
/ 07 ноября 2010

Я сейчас читаю эту удивительную книгу под названием «Погружение в Python».До сих пор все имело смысл для меня, но следующий метод оставил меня с некоторыми вопросами.Это в главе об инициализации классов:

class FileInfo(UserDict):
    "store file metadata"
    def __init__(self, filename=None):
        UserDict.__init__(self)
        self["name"] = filename

Это только последняя строка, которую я не получаю.На мой взгляд, у вызывающего объекта есть список, элементу которого «имя» присваивается значение передаваемого аргумента.Но это не имеет смысла для меня, так как я думал, что вы можете получить доступ к индексам списка только по целым числам.В книге сказано следующее об этой строке: «Вы назначаете имя файла аргумента в качестве значения ключа имени этого объекта».Является ли ключ имени другой переменной, которую определяет каждый объект (например, doc )?И если да, то почему он так доступен?

Ответы [ 5 ]

6 голосов
/ 07 ноября 2010

[...] не только для списков.Любой тип может поддерживать его, и индекс не обязательно должен быть целым числом.self - текущий объект, который в соответствии с вашим кодом происходит от UserDict, который поддерживает методы манипуляции с предметами .

2 голосов
/ 07 ноября 2010

Нет, объект self является подклассом UserDict, который является формой хеш-таблицы (известной как словарь или dict в Python). Последняя строка просто создает ключ "name" для имени файла.

2 голосов
/ 07 ноября 2010

Класс наследуется от UserDict, который, как я предполагаю, является классом, похожим на dict.Для всех подклассов dicts (который сохраняет интерфейс dict нетронутым) вы можете рассматривать self как dict, поэтому вы можете сделать self[key] = value

2 голосов
/ 07 ноября 2010

Поскольку ваш класс является производным от UserDict , он наследует метод __getitem__(), который принимает произвольный ключ, а не просто целое число:

self["name"] = filename  # Associate the filename with the "name" key.
2 голосов
/ 07 ноября 2010

Вы расширяете словарь, выполняя class FileInfo(UserDict), поэтому вы можете ссылаться на ключ, выполняя self['name'] = filename

...