Список против 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