UserDict Нормальное объяснение методов - PullRequest
1 голос
/ 06 октября 2011

Я читаю «Погружение в Python», и приведенный ниже пример дает пояснения для каждой строки, но у меня все еще возникают проблемы с интерпретацией значения.Может кто-нибудь пролить немного света на цифры 1 и 2. Я не понимаю # 1, когда он начинает рассказывать об основной технике этого класса-обёртки ... и т.д ... # 2 Я вообще не понимаю этого.Пожалуйста, помогите и обучите пожалуйста.

Пример 5.10.Нормальные методы UserDict

def clear(self): self.data.clear() ❶
def copy(self): ❷
if self.__class__ is UserDict: ❸
return UserDict(self.data)
import copy ❹
return copy.copy(self)
def keys(self): return self.data.keys() ❺
def items(self): return self.data.items()
def values(self): return self.data.values()

❶ clear - это обычный метод класса;это общедоступно, чтобы быть вызванным кем-либо в любое время.Обратите внимание, что clear, как и все методы класса, имеет в качестве первого аргумента self.(Помните, что вы не включаете self при вызове метода; это то, что Python добавляет для вас.) Также обратите внимание на базовую технику этого класса-обертки: сохраните настоящий словарь (данные) в качестве атрибута данных, определите все методычто реальный словарь имеет, и каждый метод класса перенаправить на соответствующий метод в реальном словаре.(Если вы забыли, метод очистки словаря удаляет все его ключи и связанные с ними значения.) Method Метод копирования реального словаря возвращает новый словарь, который является точной копией оригинала (все то же значение ключа)пар).Но UserDict не может просто перенаправить на self.data.copy, потому что этот метод возвращает реальный словарь, и вам нужно вернуть новый экземпляр того же класса, что и self.

1 Ответ

0 голосов
/ 06 октября 2011

Что касается пункта 1. Он просто напоминает об основах класса-обёртки ... ИМХО блок документации метода clear на самом деле не лучшее место для вызова этих основ ....

Что касается пункта 2. При вызове метода копирования вашего объекта вы стремитесь скопировать свой экземпляр, а не хранилище данных внутри экземпляра («self.data» в примере выше)

self.data.copyкопирует хранилище данных: у вас все еще нет копии вашего экземпляра UserDict ...

Но мне интересно, если нет ошибки в извлечении кода: "return UserDict (self.data)" ->Это создаст новый экземпляр в ЖЕ хранилище данных ?!Если я не ошибаюсь, было бы правильно вызвать "return UserDict (self.data.copy ())" ....

...