importing a method

Ben Finney bignose+hates-spam at benfinney.id.au
Mon Nov 28 01:25:15 CET 2005


Flavio <fccoelho at gmail.com> wrote:
> Class soandso:
>     def __init__(self):
>         self.this = 0
>         self.that = 1
>     def meth1(self):
>         ...
>     def meth2(self):
>         ...
>     def custom(self):
>         pass
> 
> I want to allow the user to write a python module that declares a
> function so that myprogram can import it and attribute it to the custom
> method of the soandso object. So far so good, that is an easy thing to
> do in Python.
> 
> import usermodule
> a=soandso()
> a.custom = usermodule.function

Apparently you haven't tested whether this works. It doesn't:

    >>> class Foo(object):
    ...   pass
    ...
    >>> def bar(*args):
    ...   print "bar() got arguments:", args
    ...
    >>> bar("spam", "eggs")
    bar() got arguments: ('spam', 'eggs')
    >>> Foo.bar_method = bar
    >>> Foo.bar_method("spam", "eggs")
    Traceback (most recent call last):
      File "<stdin>", line 1, in ?
    TypeError: unbound method bar() must be called with Foo instance as first argument (got str instance instead)
  
> But, what if the method had to access the self attributes (self.this
> and self.that) of the soandso object?

To become a method, the function must be bound to an instance, and the
method will then receive the instance as the first argument when
called as a method.

To do this on an already-defined function, use new.instancemethod.

    >>> import new
    >>> help(new.instancemethod)

-- 
 \          "One time a cop pulled me over for running a stop sign. He |
  `\        said, 'Didn't you see the stop sign?' I said, 'Yeah, but I |
_o__)             don't believe everything I read.'"  -- Steven Wright |
Ben Finney



More information about the Python-list mailing list