Что следует учитывать перед списком подклассов?

Недавно я перешел к проблеме кодирования, которую я имел, и кто-то, смотрящий на код, сказал, что список подклассов был плохим (моя проблема не была связана с этим классом). Он сказал, что вы не должны этого делать, и что он пришел с кучей плохих побочных эффектов. Это правда?

Я спрашиваю, является ли список, как правило, неправильным для подкласса, и если да, то в чем причины. В качестве альтернативы, что я должен рассмотреть перед списком подклассов в Python?

4 Solutions collect form web for “Что следует учитывать перед списком подклассов?”

В list подклассов нет преимуществ. Ни один из методов не будет использовать какие-либо методы, которые вы переопределите, поэтому вы можете иметь неожиданные ошибки. Кроме того, очень часто сбивать с толку делать такие вещи, как self.append вместо self.foos.append или особенно self[4] а не self.foos[4] для доступа к вашим данным. Вы можете сделать что-то, что работает точно так же, как список или (лучше), но очень похожий на список, который вам действительно нужен, а просто подклассифицировать object .

Абстрактные базовые классы, предоставляемые в модуле collections , в частности MutableSequence , могут быть полезны при реализации классов, подобных спискам. Они доступны в Python 2.6 и более поздних версиях.

С помощью ABC вы можете реализовать «основные» функциональные возможности своего класса, и он предоставит методы, логически зависящие от того, что вы определили.

Например, реализация __getitem__ в collections.Sequence Класс класса, достаточный для обеспечения вашего класса с __contains__ , __iter__ и другими методами.

Вы все еще можете использовать объект списка, который будет использоваться для тяжелого подъема.

Я думаю, что первый вопрос, который я задал себе, заключается в следующем: «Является ли мой новый объект действительно списком?». Он идет, как список, говорит, как список? Или это что-то еще?

Если это список, то все стандартные методы списка должны иметь смысл.

Если стандартные методы списка не имеют смысла, то ваш объект должен содержать список, а не список.

В предыдущем списке подклассификаций python (2.2?) Была плохая идея по различным техническим причинам, но в современном python это нормально.

Ник прав. Кроме того, хотя я не могу говорить с Python, в других языках OO (Java, Smalltalk) подклассификация списка – плохая идея. Следует избегать наследования в целом и вместо этого использовать состав делегаций.

Скорее, вы создаете класс контейнера и делегируете вызовы в список. Класс контейнера имеет ссылку на список, и вы можете даже разоблачить вызовы и возвраты списка в своих собственных методах. Это добавляет гибкости и позволяет вам изменить реализацию (другой тип списка или структуру данных) позже без нарушения какого-либо кода. Если вы хотите, чтобы ваш список выполнял разные вещи типа listy, ваш контейнер может это сделать и использовать простой список как простую структуру данных. Представьте, если у вас было 47 различных видов использования списков. Вы действительно хотите поддерживать 47 различных подклассов? Вместо этого вы можете сделать это через контейнер и интерфейсы. Один класс для поддержки и позволяет людям называть ваши новые и улучшенные методы с помощью интерфейса (интерфейсов), при этом реализация остается скрытой.

  • В чем разница между `sorted (list)` vs `list.sort ()`? питон
  • Объединение словарей списков в Python
  • Эффективная альтернатива "в"
  • Как Python сортирует список наборов?
  • список dicts в / из dict списков
  • Сортировка списка Python в зависимости от длины строки
  • Как распечатать список списка в один список в python без использования цикла for или while?
  • Numpy append: автоматически накладывать массив неправильного измерения
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.