How to deal __getattr__

Andrew Dalke adalke at mindspring.com
Sat Oct 16 04:21:01 EDT 2004


limodou wrote:
> I want to compare the objects themself not the attributes of them. But
> it seems python invoke __getattr__ method, it's strange. How can I
> compare the object directly without calling __getattr__?

You need to know a bit more about Python's object model.

In Python, attributes and methods are fetched with the
same notation, using the dot, as "a.z"

If it's a function then doing a.z returns a "bound method".
That means it knows it's a method of the specific instance
a.  That's how a.z() gets passed 'a' as the "self" parameter.

When you ask for a == b Python does the following steps.
(It's slightly more complicated and a bit different,
if you had used new-style classes derived from "object".)

First see if a rich comparison is defined

   a.__eq__(b)

if that fails it tries the three-way comparison

   a.__cmp__(b)

if that fails it uses the result of

   id(a) == id(b)

See the first step?  That gets the '__eq__' property
of the instance a.  Because Python doesn't distinguish
at this level between attributes and methods it first
looks for the instance in a.__dict__.  That fails so
it uses the backup plan of calling __getattr__.  In
you case it succeeds and returns None.

So "a.__eq__" returns None for you.  The next step is
to call None(b) .  But that doesn't work because None
is not a callable object.

An exception is raised and that's why you see that
error message.

				Andrew
				dalke at dalkescientic.com



More information about the Python-list mailing list