Доступ к неопределенной переменной вне метода

#python #python-3.x

#python #python-3.x

Вопрос:

Я не понимаю, почему этот код работает, я думаю, он должен выдавать ошибку, но это не так:

 class Person:
   def __init__(self, name):
       self.name = name
       
   def greeting(self):
       # Should return "hi, my name is " followed by the name of the Person.
       return "hi, my name is " self.name
   
   def __str__(self):
       return "str"

some_person = Person("foo") 
print(print(some_person.greeting()))
  

В __init__ методе я пытаюсь получить доступ к переменной, которая на самом деле не определена (не должно быть ошибки?)
и в greeting методе я пытаюсь получить доступ к той переменной, которая только что определена в __init__ (разве это не должно быть ошибкой?). Он не выдает никаких ошибок и работает бесперебойно? как это возможно?

Комментарии:

1. print(print(some_person.greeting())) должен печатать None, потому что это то, что возвращается из внутреннего print вызова.

2. Почему вы считаете, что должна быть какая-либо ошибка? В __init__ вы определяете новый атрибут ( self.name ) из существующего аргумента функции ( name ). Этот код в полном порядке…

Ответ №1:

 def __init__(self, name):
       self.name =name
  

Фактически, вы пытались получить доступ к переменной, которая фактически определена. name определяется в параметре функции.

Ответ №2:

Это не должно быть ошибкой! Это потому, что self — это сам объект (вы понимаете, почему он вызывается self ?) поэтому, если вы определяете что-то в __init__ функции, оно сохраняется внутри объекта, поэтому вы можете использовать его из другой функции, отделив его от самого объекта. name Переменная, о которой вы говорили, определена в определении функции! Где вы помещаете __init__(self, имя )

Комментарии:

1. Спасибо, приятель, я это понял. Я пришел с java, что что-то подобное абсолютно неправильно (я относился к self как к «этому» в java), но теперь это совершенно ясно.