B
Bruno Desthuilliers
Alex Popescu a écrit :
The answer is in the error message. There's no local definition of
'class_list' in function 'instance_method', and no global definition of
'class_list' in the module. If you want to access MyClass.class_list in
function instance_method, you need to use a fully qualified name, ie
either self.class_list[1], self.__class__.class_list[2],
type(self).class_list[3] or MyClass.class_list[4]
[1] this one is ok in 'read mode' since attributes not found in the
instance's __dict__ will be looked up in the class's __dict__ (and then
in parent's classes __dict__), but be warned that something like
'self.class_list = []' will create an instance attribute of the same
name, shadowing the class one. This is one of the (in)famous Python gotchas.
[2] && [3] Those two ones are equivalent. [3] is cleaner since it avoids
direct access to an implementation attribute, but [2] is faster since it
avoids a function call. In both cases, the lookup will be what one would
expect in OO, that is first on the concrete class, then in the parents
classes.
[4] Only use this one if you really want to bypass inheritance.
in
[snip...]
Not necessarily - you can access class attributes from within an
instance method (but obviously a classmethod cannot access instance
attributes).
What I am doing wrong here then:
class MyClass(object):
class_list = ['a', 'b']
def instance_method(self):
print "instance_method with class list %s" % class_list
o = MyClass()
o.instance_method()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in instance_method
NameError: global name 'class_list' is not defined
The answer is in the error message. There's no local definition of
'class_list' in function 'instance_method', and no global definition of
'class_list' in the module. If you want to access MyClass.class_list in
function instance_method, you need to use a fully qualified name, ie
either self.class_list[1], self.__class__.class_list[2],
type(self).class_list[3] or MyClass.class_list[4]
[1] this one is ok in 'read mode' since attributes not found in the
instance's __dict__ will be looked up in the class's __dict__ (and then
in parent's classes __dict__), but be warned that something like
'self.class_list = []' will create an instance attribute of the same
name, shadowing the class one. This is one of the (in)famous Python gotchas.
[2] && [3] Those two ones are equivalent. [3] is cleaner since it avoids
direct access to an implementation attribute, but [2] is faster since it
avoids a function call. In both cases, the lookup will be what one would
expect in OO, that is first on the concrete class, then in the parents
classes.
[4] Only use this one if you really want to bypass inheritance.