Alex Popescu a écrit : > Bruno Desthuilliers <[EMAIL PROTECTED]> wrote > in news:[EMAIL PROTECTED]: > > > >>[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. -- http://mail.python.org/mailman/listinfo/python-list