@Sant1

Классы и объекты в python, self?

Читаю книгу по python и дошло дело до ООП. Не совсем понимаю классы и объекты . Если я правильно понимаю то класс - это просто макет(набор методов) , а объект класса - это готовая сущность которая обладает методами это класса. Так же не понимаю зачем нужен атрибут self , в него попадает название экземпляра класса, когда я захочу передать атрибуты в класс то self просто будет содержать имя экземпляра и говорить что это для конкретного экземпляра?
class Dog():
   def __init__(self, name, age):
      self.name = name
      self.age = age
  def sit(self):
      print(self.name.title() + " is now sitting.")
  def roll_over(self):
      print(self.name.title() + " rolled over!")
  • Вопрос задан
  • 3883 просмотра
Решения вопроса 1
longclaps
@longclaps
в него попадает название экземпляра класса
Экземпляр может быть безымянным (например, лежать в списке), но идея в принципе верна - в self попадает id объекта:
class A:
    def f(self):
        print(self)
        print(hex(id(self)))

a = A()
a.f()

не понимаю зачем нужен атрибут self
Не уверен, что понимаю вопрос - настолько очевиден ответ, к тому же следующий прямо за вопросом. Смотрите на это как на синтаксический сахар: при вызове метода вы пишете экземпляр.метод(аргументы), а в реализации def метод(экземпляр, аргументы). Имя первого аргумента вообще-то произвольное, обычно пишут "self", но python3 допускает даже русский идентификатор "экземпляр", можете попробовать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
lxsmkv
@lxsmkv
Test automation engineer
Спасибо вам за вопрос. Самому стало интересно докопаться до сути. Нашел хорошее объяснение
тут
Ответ написан
Комментировать
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
Так как по некоторым причинам в питоне нет контекстов и областей видимости, то функции-классов нужно передавать в явном виде ссылку на экземпляр объекта, которая и передается первым аргументом в качестве self.
Собственно, сами классы в питоне организованы через великий dict!
>>> class T():
...  def a(self):
...     print self.test
... 
>>> a = T()
>>> a.test =1
>>> b= T()
>>> b.test =2
>>> a.a()
1
>>> b.a()
2
>>> T.a(b)
2
>>> T.a(a)
1
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы