你好我有这个代码
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调用类的方法?或者是我身边的设计错误?
非常感谢
答案 0 :(得分: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
的容器,{{1}}无法访问他们通过任何其他途径。