Список против UserList и dict против UserDict

В этот день, какой код из перечисленных выше является предпочтительным и рекомендуемым (как в Python 2, так и в 3) для создания подклассов?

Я прочитал это UserList а также UserDict были введены, потому что в прошлом list а также dict нельзя разделить на подклассы, но так как это больше не проблема, рекомендуется ли их использовать?

2 ответа

Решение

В зависимости от вашего варианта использования, в эти дни вы бы либо подкласс list а также dict напрямую, или вы можете подкласс collections.MutableSequence а такжеcollections. MutableMapping; эти опции есть в дополнение к использованию User* объекты.

User* объекты были перемещены в collections модуль в Python 3; но любой код, который использовал те в Python 2 stdlib был заменен на collections.abc абстрактные базовые классы. Даже в Python 2, UserList а также UserDict увеличены collections.* реализации, добавление методов list а также dict обеспечить за базовый интерфейс.

collections классы проясняют, что должно быть реализовано для того, чтобы ваш подкласс был полной реализацией, а также позволяют реализовывать меньшие подмножества (такие как collections.Mapping, реализуя отображение только для чтения, или collections.Sequence для объекта, подобного кортежу).

User* реализации следует использовать, когда вам нужно реализовать все, кроме базового интерфейса; например, если вам нужно поддерживать сложение, сортировку, реверсирование и подсчет так же, как list делает.

Во всем остальном вам почти всегда лучше использовать collections абстрактные базовые классы как основа; встроенные типы оптимизированы по скорости и не очень удобны для подклассов. Например, вам нужно переопределить почти каждый метод на list где обычно новый list возвращается, чтобы обеспечить возврат вашего подкласса.

Только если вам нужно создать код, который настаивает на использовании list или же dict объект (проверено с помощью isinstance() подклассы типов вариант для рассмотрения. Вот почему collections.OrderedDict это подкласс dict, например.

Нет, они больше не поощряются. Вы не должны использовать класс UserDict, поскольку он устарел. Документы говорят, что вы можете просто подкласс dict непосредственно. userdict модуль ушел в Python 3.0

Другие вопросы по тегам