Программирование
On-line приложения
Почитать
Web-сервер Apache
Печать и форматирование
MySQL
Разные рецепты
Сборка/установка
Справки
Философия
Мой опыт
Скачать
Программы на Tcl/Tk (GUI)
Программы на Python/Tk (GUI)
Программы (CLI)
Help
Хобби
Фракталы
on-line
Язык для рисования фракталов
Гиперкуб
Теория относительности
Ампуллярии
Преподавание
Студенту/абитуриенту
Мой опыт
Автора!

Методы и объекты Python

Что это такое

Я составил обзорную таблицу всех (почти всех, см. ниже) методов всех (снова почти) встроенных классов (типов) языка Python. Таблица получилась очень большая и я её выложил в на отдельной странице.

Таблица составлена для Python 2.5.1 (но есть планы по её развитию, см. ниже).

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

Что можно узнать нового.

Составляя эту таблицу я узнал на много больше нового, чем ожидал. Надеюсь она будет не менее информативна и для вас.

Знаете ли вы, что на ряду с методом __ne__, существует __nonzero__? Или, что метод __eq__ реализован далеко не для всех типов:

>>> (1.1).__eq__(1)
False
>>> (1).__eq__(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'int' object has no attribute '__eq__'

Вы уверены, что знаете все методы объектов-строк? Даже, если вы знаете методы swapcase и splitlines, то наверняка какой-нибудь partition ускользнул от вашего внимания, а метод весьма полезный.

Задумывались ли вы о различиях методов union и update? и о том, почему первый реализован только для множеств, а второй — для словарей и множеств?

Кроме того, имея под рукой такую таблицу, очень легко писать свои классы, объекты которых ведут себя, как данные встроенных типов.

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

Подводные камни

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

Так, на пример, метод __eq__ не определён для типа int, однако запись

a = 1
b = 2
if a == b:
  pass

вполне законна.

Но в большинстве случаев, наличие или отсутствие метода говорит о наличии или отсутствии соответствующей возможности.

На пример, метод __len__ есть у list (и многих других), но отсутствует у типа int; поэтому оператор len применим не всегда:

>>> len([1, 2, 3])
3
>>> len(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: object of type 'int' has no len()

Второй подводный камень — таблица не совсем полна.

Для тех, кто хочет лучше понять, что это за таблица, расскажу, как они получена.

Как получена эта таблица

Прототип

Прототип получен очень простым скриптом. Примерно таким:

#!/usr/local/bin/python

types = []
all_meth = set()
for i in (None,
          bool(1),
          1, 1L, 1.0, 1j,
          '1', u'1',
          [], (), {}, set(), buffer(''), xrange(0),
          lambda:1):
  d = dir(i)
  types.append((str(type(i))[7:-2],
                dict(map(lambda x: (x, i.__getattribute__(x).__doc__), d)),
                i))
  all_meth.update(d)

print '<html><body>' \
      '<table border="1">' \
      '<tr><th></th>'

for t in types:
  print '<th>%s</th>' % t[0]

print '</tr>'

for m in sorted(all_meth):
  print '<tr valign="top">'
  print '<th>%s</th>' % m
  for t in types:
    if m in t[1]:
      print '<td title="%s / %s">%s</td>' % (t[0],
                                             m, str(t[1][m]).replace(
                                              '&', '&amp;' ).replace(
                                              '<', '&lt;'  ).replace(
                                              '>', '&gt;'  ).replace(
                                              '"', '&quot;'))
    else:
      print '<td>n/i</td>'
  print '</tr>'

print '</table></body></html>'

На самом деле, мой скрипт был чуть-чуть сложнее, но не принципиально. Кроме того, в нём отсутствовал тип xrange. Я не стал его включать, так как он очень слабо отличается от списков, а таблица и без того слишком велика. Но для себя вы можете сгенерировать более полную таблицу, чем моя и изучить все детали.

Ручная доводка

Потом я уделил несколько часов ручной доводке прототипа:

  • Я перевёл всё на рурский язык. Местами я сократил текст (в рамках таблицы многое и так понятно), местами добавил чуть-чуть от себя.
  • Я удалил несколько методов. Это методы, которые используются только для внутренних нужд Python (на пример __getformat__) и методы, которые используются крайне редко (func_*). Кроме того, я не стал упоминать некоторые атрибуты (на пример __doc__). На мой взгляд, это не сильно уменьшило информативность, но значительно увеличило читабельность. Если вы хотите получить полный список — сгенерируйте прототип для себя.

Что хотелось бы доделать

Когда таблица была готова, стало ясно, что некоторые вещи можно было сделать лучше.

Планы примерно такие:

  • (уже сделано) Прежде всего я планирую написать небольшой скриптик, чтобы можно было просматривать информацию по частям. Это позволит добавить все типы и методы.
  • (уже сделано) Я подумываю над тем, чтобы добавить как минимум xrange и file, может быть добавлю такие типы как frozenset, возможно object и другие, если надумаю сделать совсем полную таблицу. Жду отзывов и предложений, надо ли это делать?
  • Добавить информацию и комментарии по Python 3.0. (возможно на в отдельную таблицу или как-то иначе; уж очень много изменений)
  • Сделать похожую таблицу по всем dir(__builtins__), но это уже другая история.
  • Изменить этот текст на этой странице, чтобы привести его в соответствие с текущим состоянием дел.

Если у вас есть конструктивные предложения — пишите.

© 1999 − 2008 Мичурин Алексей — http://www.michurin.com.ru/