Найти - Пользователи
Полная версия: почему аргумент "self" выполняет еще и функцию экземпляра класса?
Начало » Python для новичков » почему аргумент "self" выполняет еще и функцию экземпляра класса?
1
Petr35
1) Почему аргумент “self” выполняет еще и функцию экземпляра класса?

2) Чем отличается _init_ от обычной функции и для чего он нужен?
PEHDOM
Petr35
1) Почему аргумент “self” выполняет еще и функцию экземпляра класса?
что значит “еще”? self и есть укзатель на экземпляр класса. А какую еще по вашему функцию он выполняет?
Petr35
2) Чем отличается _init_ от обычной функции и для чего он нужен?
если вы имете ввиду __init__ то ничем, это по сути обычная функция(вернее метод класса), кроме того что она автоматом вызываеться при создании экземпляра класса.
Rodegast
> кроме того что она автоматом вызываеться при создании экземпляра класса.

Она автоматически вызывается после создания экземпляра класса.
Petr35
PEHDOM
что значит “еще”? self и есть укзатель на экземпляр класса. А какую еще по вашему функцию он выполняет?

В https://pythonworld.ru/osnovy/obektno-orientirovannoe-programmirovanie-obshhee-predstavlenie.html

написано:

“self - обязательный аргумент, содержащий в себе экземпляр класса”


Как я понял, “self” он же аргумент, он же и экземпляр то есть объект класса.

Я понимаю так, аргумент - параметр это одно, а экземпляр класса это это совсем другое.

********


Я полный чайник! У меня очень много вопросов по этой теме, весь интернет облазил и толкового ответа так и не нашел.


class B:
… arg = ‘Python’ # Все экземпляры этого класса будут иметь атрибут arg,
… # равный “Python”
… # Но впоследствии мы его можем изменить
… def g(self):
… return self.arg


# дальше идет код с моими комментариями?

>>> b = B() # как я понимаю, что это объект “b” класса “B”
>>> b.g() # как я понимаю, что объект “b” класса “B”. Я встречал и такую форму как “self.g()”
'Python'
>>> B.g(b) # это я не понимаю что это?
'Python'
>>> b.arg = ‘spam’ # объект класса с аргументом которому присваиваеться строковое значение ‘spam’
>>> b.g()
'spam'


И еще в чем отличие этого?

b.g()

от этого?

self.g()

помогите пожалуйста!

PEHDOM
Petr35
Как я понял, “self” он же аргумент, он же и экземпляр то есть объект класса.

Я понимаю так, аргумент - параметр это одно, а экземпляр класса это это совсем другое.
нет, self это аргумент, но при вызове метода класса в этот аргумент передается экземпляр класса.
Вернее экземпляр класса передаеться в первый аргумент метода класса, аргумент может иметь имя отличное от self, просто програмисты так договорились чтобы называть первый агрумент self, чтобы проще было читать чужой код.

Petr35
arg = ‘Python’ # Все экземпляры этого класса будут иметь атрибут arg,
… # равный “Python”
… # Но впоследствии мы его можем изменить
… def g(self):
не совсем, на самом деле этот атрибут будет иметь класс В, но алгоритм поиска атрибутов таков что атрибут сначала ищеться в экземпляре, если не находится то тогда в классе, если и там нет, то в родительском классе если есть наследование и тд…
когда вы делаете b.arg = ‘spam’ то вы “перекрываете” атрибут класса, тоесть создаете атрибут экземпляра, но сам атрибут класса не меняеться, чтобы в этом убедиться достаточно сделать print(B.arg).
Вроде разницы то никакой, но ровно до тех пор пока вы работаете с неизменяемыми обьектами, а когда начнете работать с изменяемыми тогда и начнеться веселье, и вы поймете что это существенная разница.

Petr35
>>> b.g() # как я понимаю, что объект “b” класса “B”. Я встречал и такую форму как “self.g()”
'Python'
>>> B.g(b) # это я не понимаю что это?
'Python'

b.g() равнозначно B.g(b). просто в первом случае первым аругментом неявно(интерпретатор делает это автоматически) передаеться указатель на экземпляр класса b, во втором - вы явно это делаете.
Petr35
И еще в чем отличие этого?

b.g()

от этого?

self.g()
в первом вы вызываете метод класса “снаружи” для конкретного экземаляра, во втором “изнутри” класса

Petr35
PEHDOM
PEHDOM, cпасибо вам большое за разъяснение!
Petr35
PEHDOM
в первом вы вызываете метод класса “снаружи” для конкретного экземпляра, во втором “изнутри” класса

Забыл спросить, а эти примеры тоже равнозначны?

a.arg = 1

self.arg = 1


PEHDOM
Petr35
Забыл спросить, а эти примеры тоже равнозначны?

a.arg = 1

self.arg = 1
они не совсем равнозначны, в первом вы конкретно “присваиваете” значение атрибуту “arg” экземпляра “a”. Во втором случае вы вызываете это изнутри класса вообще, без привязки к конкретному экземпляру.
Petr35
PEHDOM
они не совсем равнозначны, в первом вы конкретно “присваиваете” значение атрибуту “arg” экземпляра “a”. Во втором случае вы вызываете это изнутри класса вообще, без привязки к конкретному экземпляру.

Спасибо!


This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB