Короче, это обязательно. Вы должны обратиться к контейнеру, в котором хранятся методы. В большинстве случаев это означает обращение к self
.
То, как это работает, заключается в следующем. Когда вы определяете (новый стиль) класс
class FooClass(object):
def my_method(self, arg):
print self.my_method, arg
вы создаете объект type
, который содержит метод в его состоянии unbound . Затем вы можете ссылаться на этот несвязанный метод через имя класса (т.е. через FooClass.my_method
); но чтобы использовать метод, вы должны явно передать объект FooClass
через параметр self
(как в FooClass.my_method(fooclass_instance, arg)
).
Затем, когда вы создаете экземпляр своего класса (f = FooClass()
), методы FooClass
привязываются к конкретному экземпляру f
. self
в каждом из методов затем ссылается на этот экземпляр (f
); это автоматически, поэтому вам больше не нужно явно указывать f
в методе. Но вы все равно можете сделать FooClass.my_method(f, arg)
; это было бы эквивалентно f.my_method(arg)
.
Обратите внимание, однако, что в обоих случаях self
- это контейнер, через который другие методы класса передаются в my_method
, который не имеет доступа к ним через другие пр.