Ключевое слово Python 'self'
Я новичок в Python (обычно работаю на C#), начал использовать его в течение последних нескольких дней.
внутри класса, вам нужно префикс любого вызова, что классы данных членов и методов? Итак, если я вызываю метод или получаю значение из этого класса, из этого класса, мне нужно использовать self.method()
или self.intvalue
, например?
Я просто хочу проверить, что нет менее подробного способа, с которым я еще не сталкивался.
3 ответа:
существует не менее подробный способ. Всегда используйте
self.x
для доступа к атрибуту экземпляраx
. Обратите внимание, что в отличие отthis
в C++,self
это не ключевое слово, хотя. Ты может дайте первому параметру вашего метода любое имя, которое вы хотите, но вам настоятельно рекомендуется придерживаться соглашения о его вызовеself
.
Я дополню (точный) ответ Свена ответом на естественный последующий вопрос (т. е. почему и
self
явный, а не неявный?).Python работает таким образом, поскольку он оперирует идеей лексической области: ссылки на голые имена всегда будут ссылаться на локальную переменную в текущем определении функции, локальную переменную содержащего определения функции, глобальную переменную модуля или встроенную. (Объем является лексическим, как когда вы следуйте за деревом разбора вниз во время анализа символов, вам нужно только запомнить имена, видимые в определениях функций на пути вниз к текущей функции - все остальное может быть обработано как "не видно, поэтому глобальный или встроенный". Также стоит явно отметить, что правила определения области относятся к вложенности функции определения, а не звонки).
методы не получают какого - либо особого специального режима в этом отношении-утверждения класса в основном не имеет отношения к правилам лексической области, поскольку в некоторых языках нет такого же четкого различия между функциями и методами, которое существует (вместо этого методы динамически создаются из функций, когда соответствующие атрибуты извлекаются из объектов).
это позволяет добавить функцию в класс после того, как она уже была определена и неотличима от тех методов, которые были определены в теле оператора класса (процесс, известный как "monkeypatching").
self.обратите внимание, что для сложных алгоритмов не редкость кэшировать ссылки на переменные-члены в качестве локальных переменных внутри метода.
во-первых, в Python
self
Это не ключевое слово, это соглашение о кодировании, то же самое, что и Pythoncls
.Гвидо написал действительно подробную и ценную статью о происхождении поддержки Python для класса, и в этой статье Гвидо объясняет, почему использовать
self
иcls
и зачем они нужны.см http://python-history.blogspot.com/2009/02/adding-support-for-user-defined-classes.html.