Когда использовать специальные методы Python?

1

Я знаю, что классы могут реализовывать различные специальные методы, такие как __iter__, __setitem__, __len__, __setattr__ и многие другие. Но когда я должен их использовать? Может ли кто-нибудь описать типичные сценарии, когда я захочу их реализовать, и они упростят программирование на Python?

Спасибо, Бода Сидо.

Теги:

4 ответа

3
Лучший ответ

Я думаю, вы в основном ответили на свой вопрос.

Ознакомьтесь со специальными методами. Если вы обнаружите, что использование одного из них сделает вашу программу более простой, используйте ее. Если вы не понимаете, для чего это нужно, или чувствуете, что это более сложное решение, вы ответили на вопрос. Не используйте его.

Типичными сценариями являются:

  • Переопределяющие операторы

  • Доступ к атрибутам, которые не существуют и которые имеют доступ к этому доступу (__getattr__)

  • Манипулирование создания класса и экземпляра (__init__, __slots__, __new__)

  • Настройка представлений строк (__str__ и __repr__)

  • позволяющий распознавать (__call__)

  • Включение в удобный/хорошо используемый встроенный синтаксис (__getitem__, __len__ и т.д.)

Они в основном рассматриваются в https://docs.python.org/reference/datamodel.html#specialnames и http://docs.python.org/reference/datamodel.html#special-method-names

  • 0
    @Joe, спросите вы (возможно риторический?) «Почему реализации ИТЭР» - ответ, очевидно, чтобы экземпляр вашего класса , чтобы быть в x в некоторых for item in x: ... петли, как это обычно делается с контейнерными классами. То, как вы реализуете __iter__ вполне может быть __iter__ с yield s, но странно думать, что ответ на вопрос «как» вообще подразумевает что-либо о «почему!»)
  • 0
    На самом деле. Я только что пропустил это использование, я думаю, мне редко нужно было эмулировать типы контейнеров ....
3

Ну, короткий ответ: когда вам это нужно.

Так как есть много встроенных функций, я не могу ответить за них. Тем не менее, вы почти всегда можете обойтись без переопределения встроенной функции Python.

Обычно, когда вам это нужно, это когда вы хотите, чтобы ваш объект вел себя как встроенный тип данных в Python. Например, если вы хотите запустить

len(...)

на свой объект (переопределить _____ len _____ (...)) или сравнить два объекта ваших типов данных следующим образом:

obj1 < obj2

(переопределить _____ cmp _____ (...)) для этого.

0

getattr и setattr полезны, когда вы хотите реализовать интерфейс, делегируя члену экземпляра вместо прямого наследования. Вы сопоставляете их с getattr и setattr члена.

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню