Я изучаю Python и наткнулся на часть ООП. В то время, когда я делал свои первые шаги с PHP ООП, но то же самое происходит и со мной, я не понимаю, как использовать значение self внутри метода.
Я читал в Интернете, и там говорится о самоссылке на класс и так далее, но, честно говоря, я не понимаю эту концепцию.
Например:
class Persona:
def inicializar(self,nom):
self.nombre=nom
def imprimir(self):
print("Nombre",self.nombre)
persona1=Persona()
persona1.inicializar("Pedro")
persona1.imprimir()
persona2=Persona()
persona2.inicializar("Carla")
persona2.imprimir()
Кто-нибудь будет так любезен, чтобы объяснить мне, для чего это self
?
В Python почти все является объектом, в отличие от других языков, класс тоже является объектом, это звучит странно, но на самом деле это так:
Мы видим, что класс
Prueba
является объектом типа<class 'type'>
, а созданный объект теперь имеет тип if<class 'Prueba'>
. Имея это в виду, может быть яснее, почему использованиеself
. Предположим, что-то похожее на ваш пример:Мы использовали объект
Persona
типа<class 'type'>
(класс) для создания двух новых объектов<class 'Persona'>
. Обычным способом доступа к методам было бы сделать это:Но то, что на самом деле происходит внутри, то есть то, что на самом деле делает Python , выглядит примерно так:
Один из способов увидеть это состоит в том, что каждый экземпляр
p1
не имеетp2
«копий» методаimprimir
, не имеет смысла, метод принадлежит классуPersona
, данныеself.nombre
принадлежат каждому экземпляру. Поэтому, чтобы его можноPersona
было вызывать,imprimir
но с правильными данными экземпляра, вам нужно объявить метод какimprimir(<instancia>)
.Уточнение:
self
по соглашению мы можем использовать любое имя, но это не рекомендуется.Дополнить и принять к сведению. Использование
self
- это соглашение в Python, хорошая практика, но не правило (это не зарезервированное слово или что-то в этом роде).Под этим я подразумеваю, что вы можете использовать любое имя для представления экземпляра класса:
Для Python это совершенно нормальный класс. В классе
A
я изменилself
наinstancia
. Обратите внимание , это просто уточнение.Вы также можете столкнуться с некоторыми методами, которых нет
self
, например, при использовании статических методов:Использование в
self
качестве первого аргумента методов указано в аргументах функций и методов PEP 8 (руководстве по стилю для кода Python).Параметр
self
относится к экземпляру объекта того класса, для которого вызывается указанный метод. То есть объект, который вы использовали для вызова метода (в вашем примереpersona1
иpersona2
).Python в определенных методах класса устанавливает, что первый параметр, определенный в методе, получит объект, с которым вызывается указанный метод. Этот параметр (который обычно вызывается,
self
хотя может использоваться любое имя переменной [ см. комментарии ]) используется в реализации метода для изменения содержимого или атрибутов указанного объекта по желанию.Поэтому необходимым условием является то, что все методы класса, которые могут быть вызваны через объект, имеют хотя бы один параметр, который будет автоматически присвоен объекту, используемому при вызове.
Хотя в определении метода
self
это первый параметр, при вызове указанного метода нет необходимости явно передавать сам объект в качестве первого параметра, поскольку Python делает это неявно, без необходимости делать это вручную. То есть первый параметрself
метода автоматически присваивается самому объекту, а остальные параметры аргументам, с которыми вы вызываете метод.В случае метода
__init__()
параметрself
относится к вновь созданному объекту класса, который вы хотите получить при создании указанного объекта с помощьюNombre_Clase()
.self
является эквивалентомthis
других языков (хотяself
это и не зарезервированное слово вродеthis
[ см. комментарии ]), с той разницей, что в других языках не нужно определять методы с параметромthis
, а в Python необходимо .Как вы говорите, это ссылка на себя, и, как правило, в методе экземпляра модели вы должны использовать self при изменении атрибутов или когда существует некоторая двусмысленность между вызовом локальной переменной и уже определенным атрибутом/методом. Это происходит во всех языках, использующих ООП, и это очень распространенная практика и самая правильная, поэтому я советую вам ее использовать.