2012-02-12 2 views
3

Привет я этот кодКак вызвать внутренние функции внутри класса конструктора?

class Test(object): 
    def start_conn(self): 
     pass 

    def __init__(self): 
     self.conn = start_conn() 

Но этот код делает эту ошибку:

NameError: global name 'start_conn' is not defined

Если я пишу self.conn = self.start_conn() программа работает без ошибок, на мой вопрос, является обязательным для вызова с self методы класса, когда я создаю новый экземпляр? или является ошибкой desgin с моей стороны?

Большое спасибо

+0

Да, вам нужно указать я в питоне явно. Есть ли «класс» вокруг ваших двух методов? – Gregor

ответ

4

Одним словом, это необходимо. Вы должны обратиться к контейнеру, в котором хранятся методы. Большую часть времени это означает ссылку на 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, которые не имеют доступа к ним через любой другой проспект.

Смежные вопросы