Наследование напрямую от встроенного типа и его класса-оболочки в Python - PullRequest
1 голос
/ 02 ноября 2009

Я сейчас читаю Dive Into Python Марка Пилигрима и попал в раздел о наследовании. В разделе 5.5 Пилигрим упоминает о различиях между наследованием от класса-оболочки UserDict и наследованием от встроенного типа dict.

У меня возникают проблемы с пониманием, почему кто-то вообще беспокоится о классе-оболочке ... Каковы преимущества наследования от класса-оболочки UserDict (или любого другого класса UserXxx)?

Ваш вклад очень ценится. Спасибо!

Ответы [ 3 ]

3 голосов
/ 02 ноября 2009

Классы-оболочки были удалены из Python 3, так как они уже давно не так полезны. Класс mixin , UserDict.DictMixin, - это совершенно другая история - его полезные функции теперь можно найти во всех «абстрактных базовых классах» в модуле collections (Python 2.6 и 3. *).

3 голосов
/ 02 ноября 2009

Ты прав:

Потребность в этом классе была в значительной степени вытесняется способностью подкласс прямо из dict (особенность который стал доступен, начиная с Python версия 2.2). До введение dict, UserDict класс был использован для создания словарь подклассы, которые получил новое поведение путем переопределения существующие методы или добавление новых.

Обратите внимание на первое предложение. Это происходит из документации UserDict.

О, а в Python 3 его уже нет.

1 голос
/ 02 ноября 2009

Я нашел на странице, на которую вы ссылаетесь, подсказку относительно ответа:

В версиях Python до 2.2, вы не могли напрямую подкласс встроенные типы данных, такие как строки, списки и словари. Компенсировать для этого Python поставляется с оберткой классы, которые имитируют поведение эти встроенные типы данных: UserString, UserList и UserDict. Используя сочетание нормального и особенного методы, класс UserDict делает отличная имитация словаря. В Python 2.2 и более поздних версиях вы можете наследовать классы напрямую от встроенного типы данных, такие как dict.

В действительности, сегодня вы, вероятно, хотите использовать подкласс dict, а не UserDict.

...