Как вызвать внутренние функции внутри класса конструктора? - PullRequest
3 голосов
/ 12 февраля 2012

Здравствуйте, у меня есть этот код

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(), программа работает без ошибок, мой вопрос: нужно ли самому вызывать методы класса, когда я создаю новый экземпляр? или это ошибка с моей стороны?

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

1 Ответ

4 голосов
/ 12 февраля 2012

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

...