Подтвердить что ты не робот

Python 'self' ключевое слово

Я новичок в Python (обычно работаю на С#), начал использовать его за последние пару дней.

Внутри класса вам нужно префикс любого вызова данных и методов данных классов? Итак, если я вызываю метод или получаю значение из этого класса, из этого класса мне нужно использовать self.method() или self.intvalue, например?

Я просто хочу проверить, что еще нет более подробного способа, с которым я еще не сталкивался.

4b9b3361

Ответ 1

Существует не менее подробный способ. Всегда используйте self.x для доступа к атрибуту экземпляра x. Обратите внимание, что в отличие от this в С++, self не является ключевым словом. Вы можете дать первому параметру своего метода любое имя, которое вы хотите, но вам настоятельно рекомендуется придерживаться соглашения о его вызове self.

Ответ 2

Я добавлю Sven (точный) ответ с ответом на естественный вопрос о последующих действиях (т.е. почему self явный, а не неявный?).

Python работает таким образом, поскольку он работает над идеей лексического охвата: ссылки на искомые имена всегда будут ссылаться на локальную переменную в текущем определении функции, локальную переменную содержащего определения функции, глобальную переменную модуля или встроенный. (Сфера охвата лексика, как когда вы следуете за деревом разбора во время анализа символов, вам нужно только запомнить имена, видимые в определениях функций на пути до текущей функции, - все, что может быть обработано как "не видно", поэтому глобальное или встроено ". Также стоит прямо отметить, что правила определения охвата относятся к вложению определений функций, а не к вызовам).

Методам не уделяется особого специального лечения в этом отношении - утверждения класса в значительной степени не имеют отношения к лексическим правилам определения, поскольку на некоторых языках существует не такая острая функция, как различие в методах, но существует метод динамического создания от функций, когда соответствующие атрибуты извлекаются из объектов).

Это позволяет добавить функцию в класс после того, как она уже определена и неотличима от тех методов, которые были определены внутри тела оператора класса (процесс, известный как "monkeypatching" ).

Поскольку пространства имен объектов отделены от лексических правил определения области видимости, необходимо указать другой способ ссылки на эти атрибуты. Это задача, обрабатываемая явным self.

Обратите внимание, что для сложных алгоритмов нередко кэшировать ссылки на переменные-члены как локальные переменные внутри метода.

Ответ 3

Во-первых, Python self не является ключевым словом, это соглашение о кодировании, такое же, как Python cls.

Guido написал очень подробную и ценную статью о происхождении поддержки Python для класса, и в этой статье Гвидо объясняет, зачем использовать self и cls, и почему они необходимы.

См. http://python-history.blogspot.com/2009/02/adding-support-for-user-defined-classes.html.