Анимация
JavaScript
|
Главная Библионтека >>> x = Complex(3.0, -4.5) >>> x.r, x.i (3.0, -4.5) 9.3.3 Объекты-экземпляры Что мы теперь можем делать с объектами-экземплярами? Основная операция, воспринимаемая объектом-экземпляром - доступ к его атрибутам. Атрибуты могут быть двух i = 12345 def f(x): return Привет всему миру Тогда i и f являются действительными атрибутами, ссылающимися на целое число и объект-метод соответственно. Атрибутам можно присваивать новые значения, например, Вы можете изменить значение MyClass.i. doc также является действительным атрибутом, ссылающимся на строку документации класса: Простой пример класса . Создание экземпляра класса использует запись вызова функций. Просто считайте объект-класс функцией без параметров, возвращающей созданный экземпляр класса. Например, x = MyClass() создает новый экземпляр класса и присваивает его локальной переменной x. В приведенном примере создается "пустой" объект. Во многих случаях необходимо создавать объект с определенным начальным состоянием - для этого класс должен содержать специальный метод init () , например: class MyClass: def init (self): self.data = [] Если для класса определен метод init () , то он автоматически вызывается при создании каждого экземпляра этого класса. Для большей гибкости метод init () , конечно, может иметь аргументы. В этом случае, аргументы, используемые при создании экземпляра класса, передаются методу init () . Например: >>> class Complex: ... def init (self, realpart, imagpart): ... self.r = realpart ... self.i = imagpart x.counter = 1 while x.counter < 10: x.counter = x.counter * 2 print x.counter del x.counter Второй тип атрибутов - методы. Метод - это функция, "принадлежащая" объекту. В языке Python термин "метод" применим не только к экземплярам классов - другие объекты тоже могут иметь методы. Например, у объектов-списков есть методы append() , insert() , remove() , sort() и т. д. Однако ниже, если явно не указано другого, мы будем использовать термин "метод" для методов экземпляров (instance method). Действительные имена методов объекта-экземпляра зависят от класса: все атрибуты класса, являющиеся объектами-функциями автоматически становятся методами при обращении к соответствующим атрибутам экземпляра2. Так, в нашем примере x.f является методом, привязанным к объекту x. Но x.f - это не то же самое, что и MyClass.f. В первом случае метод "знает" объект, к которому он применяется, во втором - он не привязан к какому-либо объекту и ведет себя аналогично функции. 9.3.4 Методы экземпляров классов Обычно метод вызывают непосредственно: x.f() В нашем примере он вернет строку Привет всему миру. Однако совсем не обязательно вызывать метод прямо. x.f является объектом-методом, и его можно сохранить для дальнейшего использования: xf = x.f while 1: print xf() 2Функция может быть записана в lambda-форме, однако другие объекты, поддерживающие вызов (класс или экземпляр класса, для которого определен метод call ) не подходят. видов. Первый - атрибуты данных. Они соответствуют "переменным экземпляра" в Smalltalk и "членам данных" в C++. Атрибуты данных не нужно декларировать: они возникают, когда им первый раз присваивают значение. Например, если x является экземпляром класса MyClass , определенного выше, следующий код выведет значение 16: 9.4 Выборочные замечания Атрибуты экземпляров (обычно атрибуты данных) записываются поверх атрибутов классов (обычно методов) с тем же именем. Чтобы избежать конфликтов имен, которые могут привести к тяжело обнаружимым ошибкам, полезно использовать своего рода соглашение, позволяющее минимизировать вероятность конфликтов. Например: называть методы именами, начинающимися с заглавной буквы, добавлять небольшую приставку в начало имен атрибутов данных (возможно просто символ подчеркивания) или использовать глаголы для методов и существительные для атрибутов данных. В некоторых случаях изменение атрибутов данных напрямую, а не с помощью специально предназначенных для этого методов, может привести к порче инварианта объекта и непригодности его для дальнейшего использования. Вы можете "спрятать" данные и, тем самым, защитить их от случайного изменения. Для этого в языке существует соглашение: все атрибуты, имена которых содержат не менее двух символов подчеркивания в начале и не более одного символа подчеркивания в конце, считаются частными и доступны только из методов объекта. (На самом деле, Вы можете получить доступ к частным атрибутам извне, используя специальное имя, однако такой доступ никак не назовешь случайным. Более подробно работа с частными атрибутами описана в разделе 9.6.) С другой стороны, модули расширения, написанные на C, могут полностью будет выводить Привет всему миру до тех пор, пока выполнение не будет прервано. Что же происходит при вызове метода? Вы могли заметить, что x.f() вызывается без аргумента, несмотря на то, что в определении аргумент указан. Что же случилось с аргументом? Конечно, Python генерирует исключение, если функцию, требующую аргумент, вызвать без него - даже если аргумент на самом деле не используется. Вы могли уже догадаться: особенность методов состоит в том, что объект, для которого он применяется, передается в качестве первого аргумента. В нашем примере вызов x.f() полностью эквивалентен MyClass.f(x). В общем, вызов метода, привязанного к объекту, со списком из n аргументов полностью эквивалентен вызову соответствующего не привязанного метода (или функции) со списком аргументов, полученным добавлением объекта перед первым аргументом. Если Вы все еще не поняли, как работают методы, возможно, взгляд на реализацию внесет ясность. Если Вы ссылаетесь на атрибут объекта, не являющийся атрибутом данных, то поиск атрибута производится в классе, экземпляром которого является объект. Если имя соответствует действительному атрибуту класса, который определен как функция, то атрибут считается методом. Метод является структурой, содержащей информацию о классе, в котором он определен, и функции, его представляющей, но "не знает", к какому именно объекту будет применяться (не привязанный к объекту метод). Соответствующий атрибут экземпляра класса, в свою очередь, содержит, помимо указанной информации, еще и ссылку на объект-экземпляр (привязанный к объекту метод) упакованные вместе в объекте-методе. При вызове метода со списком аргументов, он распаковывается, создается новый список аргументов из объекта-экземпляра и исходного списка аргументов, и с этим списком вызывается объект-функция. 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 [ 23 ] 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |