如何在构造函数内部调用内部函数?

3 投票
1 回答
6163 浏览
提问于 2025-04-17 12:54

你好,我有这段代码:

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吗?还是说这是我设计上的错误?

非常感谢!

1 个回答

4

简单来说,这是必须的。你需要提到存放方法的容器。大多数情况下,这意味着要提到 self

它的工作原理如下。当你定义一个(新风格的)类时,

class FooClass(object):
    def my_method(self, arg):
        print self.my_method, arg

你会创建一个 type 对象,这个对象里面包含了方法,但这些方法是处于一种“未绑定”的状态。你可以通过类的名字来引用这个未绑定的方法(比如 FooClass.my_method);但是要使用这个方法,你必须明确地通过 self 参数传入一个 FooClass 的对象(就像 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 的容器,而 my_method 通过其他方式是无法访问这些方法的。

撰写回答