如何在构造函数内部调用内部函数?
你好,我有这段代码:
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
通过其他方式是无法访问这些方法的。