Одним словом, это необходимо. Вы должны обратиться к контейнеру, в котором хранятся методы. Большую часть времени это означает ссылку на self
.
Способ, которым это работает, заключается в следующем. При определении (новый стиль) класса
class FooClass(object):
def my_method(self, arg):
print self.my_method, arg
вы создаете type
объект, содержащий метод в его несвязанного состоянии. Затем вы можете ссылаться на этот несвязанный метод через имя класса (то есть через 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
, которые не имеют доступа к ним через любой другой проспект.
Да, вам нужно указать я в питоне явно. Есть ли «класс» вокруг ваших двух методов? – Gregor