Теперь следует посмотреть на них в свете только что приведенных определений. Пример:
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 больше нет
Типопределяет область допустимых значений объекта и набор операций над ним. В ООП тип тесно связан с поведением— действиями объекта, состоящими в изменении внутреннего состояния и вызовами методов других объектов.
Ранее в языке Python встроенные типы данных не являлись экземплярами класса, поэтому считалось, что это были просто объекты определенного типа. Теперь ситуация изменилась, и объекты встроенных типов имеют классы, к которым они принадлежат. Таким образом, тип и класс в Python становятся синонимами.
Интерпретатор языка Python всегда может сказать, к какому типу относится объект. Однако с точки зрения применимости объекта в операции его принадлежность к классу не играет решающей роли: гораздо важнее, какие методы поддерживает объект.
Примечание:
Пока что в Python есть «классические» и «новые» классы. Первые классы определяются сами по себе, а вторые обязательно ведут свою родословную от класса object
. Для целей данного изложения разница между этими видами классов не имеет значения.
Экземпляры классов могут появляться в программе не только из литералов или в результате операций. Обычно для получения объекта класса достаточно вызвать конструкторэтого класса с некоторыми параметрами. Объект–класс, как и объект–функция, может быть вызван. Это и будет вызовом конструктора:
>>> import sets
>>> s = sets.Set([1, 2, 3])
В этом примере модуль sets
содержит определение класса Set
. Вызывается конструктор этого класса с параметром [1, 2, 3]
. В результате с именем s
будет связан объект–множество из трех элементов 1, 2, 3
.
Следует заметить, что, кроме конструктора, определенные классы имеют и деструктор— метод, который вызывается при уничтожении объекта. В языке Python объект уничтожается в случае удаления последней ссылки на него либо в результате сборки мусора, если объект оказался в неиспользуемом цикле ссылок. Так как Python сам управляет распределением памяти, деструкторы в нем нужны очень редко. Обычно в том случае, когда объект управляет ресурсом, который нужно корректно вернуть в определенное состояние.
Еще один способ получить объект некоторого типа — использование функций–фабрик. По синтаксису вызов функции–фабрики не отличается от вызова конструктора класса.
Читать дальше
Конец ознакомительного отрывка
Купить книгу