Объекты

До этой лекции объекты Python встречались много раз: ведь каждое число, строка, функция, модуль и т.п. — это объекты. Некоторые встроенные объекты имеют в Python синтаксическую поддержку (для задания литералов). Таковы числа, строки, списки, кортежи и некоторые другие типы.

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

a = 3

b = 4.0

c = a + b

Здесь происходит следующее. Сначала имя «a» связывается в локальном пространстве имен с объектом–числом 3 (целое число). Затем «b» связывается с объектом–числом 4.0 (число с плавающей точкой). После этого над объектами 3 и 4.0 выполняется операция сложения, и имя «c» связывается с получившимся объектом. Кстати, операциями, в основном, будут называться методы, которые имеют в Python синтаксическую поддержку, в данном случае — инфиксную запись. То же самое можно записать как:

c = a.__add__(b)

Здесь __add__() — метод объекта a, который реализует операцию + между этим объектом и другим объектом.

Узнать набор методов некоторого объекта можно с помощью встроенной функции dir():

>>> dir(a)

['__abs__', '__add__', '__and__', '__class__', '__cmp__',

 '__coerce__', '__delattr__', '__div__', '__divmod__',

 '__doc__', '__float__', '__floordiv__', '__getattribute__',

 '__getnewargs__', '__hash__', '__hex__', '__init__',

 '__int__', '__invert__', '__long__', '__lshift__',

 '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__',

 '__oct__', '__or__', '__pos__', '__pow__', '__radd__',

 '__rand__', '__rdiv__', '__rdivmod__', '__reduce__',

 '__reduce_ex__', '__repr__', '__rfloordiv__',

 '__rlshift__', '__rmod__', '__rmul__', '__ror__',

 '__rpow__', '__rrshift__', '__rshift__', '__rsub__',

 '__rtruediv__', '__rxor__', '__setattr__', '__str__',

 '__sub__', '__truediv__', '__xor__']

Здесь стоит указать на еще одну особенность Python. Не только инфиксные операции, но и встроенные функции ожидают наличия некоторых методов у объекта. Например, можно записать:

abs(c)

А функция abs() на самом деле использует метод переданного ей объекта:

c.__abs__()

Объекты появляются в результате вызова функций–фабрик или конструкторов классов (об этом ниже), а заканчивают свое существование при удалении последней ссылки на объект. Оператор del удаляет имя (а значит, и одну ссылку на объект) из пространства имен:

a = 1

# ...

del a

# имени a больше нет