Unexpected behavior with class and instance variables...

Alex Martelli aleaxit at yahoo.com
Wed Jul 11 03:06:12 EDT 2001


"tracy s. ruggles" <trace at reinventnow.com> wrote in message
news:B77159A3.390B%trace at reinventnow.com...
> I'm trying to build a wrapper for any given function and noticed some odd
> behavior with using class variables instead of instance variables.

Yep.  Specifically (3.2 in the Language Reference manual):
"""
User-defined method objects are created in two ways: when getting
an attribute of a class that is a user-defined function object, or
when getting an attribute of a class instance that is a user-defined
function object defined by the class of the instance.
"""

In other words: when you access a class attribute (whether from
the class object, or from an instance of the class) and the
class attribute is a user-defined function, then what you get
is *NOT* a function-object: you get a method-object instead.

No such magic transformation occurs when you access an instance
attribute stricto sensu (one held in the instance's __dict__,
as opposed to one the instance gets from its __class__).  No
such magic transformation occurs for ANY other type of class
attribute EXCEPT "user-defined function-objects".  One common
workaround is thus to wrap a user-defined function into some
other kind of callable.  See for example
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/52304
for a bit more discussion.  The key idea there is:

class Callable:
    def __init__(self, anycallable):
        self.__call__ = anycallable

and use Callable(myfunction) rather than the bare myfunction
to set your class attributes.

Alternatively, you can use the im_func attribute of a method
object to get back the underlying function object.


Alex






More information about the Python-list mailing list