About instance.name look up order
Kev Dwyer
kevin.p.dwyer at gmail.com
Thu Dec 29 13:03:13 EST 2011
Prim wrote:
> First, sorry about my poor english.
> Put these in IPython under ubuntu.
>
-------------------------------------------------------------------------------------
> class C:
> def __init__(self):
> self.x = 1
> def print(self):
> print self.x
> c = C()
> c.x --> 1, so c.x mean a attr of c named 'x'
> c.print() --> pirnt 1, so c.print mean a method of c named 'print'
>
-------------------------------------------------------------------------------------
> class C:
> def __init__(self):
> self.x = 1
> def x(self):
> print 'x method'
> def y(self):
> print 'y method'
> c = C()
> c.x --> 1
> c.x() --> TypeError: 'int' object is not callable
> c.y --> bound method C.y
> #Q1: instance.name will get the attr first, than method?
>
-------------------------------------------------------------------------------------
> class C:
> def x(self):
> print 'x method'
> def __getattr__(self, attr):
> print 'in __getattr__ method'
> return attr
> c = C()
> c.x --> print in __getattr__ method, then throw TypeError: 'str'
> object is not callable
> c.x() --> print in __getattr__ method, x method 2 lines
> #Q2: why c.x would get a exception?
>
> t = c.x
> t --> print in __getattr__ method, then throw TypeError: 'str' object
> is not callable
> t() --> print x method
> t = c.x() --> print x method, t == None
> #Q3 why t=c.x() and c.x() output different?
>
> #Q4, if when I define the class use property too, then instance.name
> look up order would be?
>
> Thanks for your reply.
Hello,
Python always looks for attributes in the instance first, then in the class,
and then in the class's superclasses. In your first example, by defining
"x" in C.__init__ you are creating an instance attribute named "x". When
the attribute c.x is requested, Python finds an attribute "x" in the
instance and returns it; the method "x" is found in the class, but the
attribute lookup does not proceed this far.
Try looking at C.__dict__ and c.__dict__ in the interpreter to see how the
attributes are stored.
See also
http://docs.python.org/reference/datamodel.html#customizing-attribute-access
Cheers
Kev
More information about the Python-list
mailing list