Передача «себя» в качестве параметра при вызове функции в классе (Python)

#python #class

Вопрос:

Я определил класс и в рамках этого класса создал несколько методов. В одном из методов я хочу вызвать другой метод. В чем причина, по которой я не могу вызвать метод, поместив «себя» в аргумент? Например, метод2(самостоятельная работа).

Ответ №1:

Существуют языки , которые позволяют вам писать method2() как сокращение (что было бы в Python) self.method2() , но вы не можете писать на Python. Python не рассматривает self аргумент как особый внутри функции (за исключением случаев вызова super() ).

В Python method2(self) в первую очередь просматривается method2 текущая область. Кажется, что это должно быть в области видимости, но на самом деле это не так из-за странных правил определения области Python. Ничто в любой class области никогда не отображается во вложенных областях:

 x = 1  class A:  x = 2   print(x) # prints 2   def method(self):  print(x) # prints 1   class B:  print(x) # prints 1  

Даже если method2 бы он находился в области видимости, его прямой вызов вызвал бы метод из определяемого в данный момент класса, а не переопределенный метод, соответствующий динамическому типу self . Чтобы назвать это, вы должны написать self.method2() .

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

1. не могли бы вы объяснить, что вы подразумеваете под «динамическим типом личности»?

Ответ №2:

self Параметр автоматически передается как объект, из которого вы вызываете метод. Так что , если я сказал self.method2() , он автоматически поймет, что звонит self.method2(self)

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

1. self.method2(self) это не то же self.method2() самое, что .

2. Для обычных методов self.method() это эквивалентно type(self).method(self) , я предполагаю , что это то, что вы пытались написать.

Ответ №3:

Вы можете вызвать метод с self аргументом, но в этом случае метод следует вызывать как метод класса, а не как экземпляр.

 class A:  def method1(self):  print(1)   def method2(self):  A.method1(self)  a = A() a.method2() # 1