Reputation: 2344
Hello i have this code
class Test(object):
def start_conn(self):
pass
def __init__(self):
self.conn = start_conn()
But this code make this error:
NameError: global name 'start_conn' is not defined
If i write self.conn = self.start_conn()
the program works without error, my question is, is a must to call with self the methods of the class when i'm creating a new instance? or is a desgin error from my side?
Thanks a lot
Upvotes: 3
Views: 6251
Reputation: 150977
In short, it's a must. You have to refer to the container in which the methods are stored. Most of the time that means referring to self
.
The way this works is as follows. When you define a (new-style) class
class FooClass(object):
def my_method(self, arg):
print self.my_method, arg
you create a type
object that contains the method in its unbound state. You can then refer to that unbound method via the name of the class (i.e. via FooClass.my_method
); but to use the method, you have to explicitly pass a FooClass
object via the self
parameter (as in FooClass.my_method(fooclass_instance, arg)
).
Then, when you instantiate your class (f = FooClass()
), the methods of FooClass
are bound to the particular instance f
. self
in each of the methods then refers to that instance (f
); this is automatic, so you no longer have to pass f
into the method explicitly. But you could still do FooClass.my_method(f, arg)
; that would be equivalent to f.my_method(arg)
.
Note, however, that in both cases, self
is the container through which the other methods of the class are passed to my_method
, which doesn't have access to them through any other avenue.
Upvotes: 4