Когда использовать специальные методы Python? - PullRequest
1 голос
/ 11 марта 2010

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

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

Ответы [ 4 ]

3 голосов
/ 11 марта 2010

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

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

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

len(...)

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

obj1 < obj2

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

3 голосов
/ 11 марта 2010

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

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

Типичные сценарии:

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

  • Перехват доступа к несуществующим атрибутам и работа с этим доступом (__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 голосов
/ 25 сентября 2012

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

0 голосов
/ 11 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...