#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