dynamic function add to an instance of a class

Peter Otten __peter__ at web.de
Thu Apr 29 10:43:38 CEST 2010


News123 wrote:

> Peter Otten wrote:
>> Richard Lamboj wrote:
>> 
>>> i want to add functions to an instance of a class at runtime. The added
>>> function should contain a default parameter value. The function name and
>>> function default paramter values should be set dynamical.
>> 
>>>>> class A(object):
>> ...     def __init__(self, x):
>> ...             self.x = x
>> ...     def m(self):
>> ...             return self.f(self.x)
>> ...
>>>>> a = A(42)
>>>>>
>>>>> def foo(self, a, b):
>> ...     return self.x + a**b
>> ...
>>>>> from functools import partial
>>>>> a.f = partial(foo, a, 3)
>>>>> a.m()
>> 109418989131512359251L
>>>>> 42 + 3**42 == _
>> True
>> 
>> Confused? The important points are
>> 
>> (1)
>> 
>> functools.partial(f, a1, a2, a3, ...)(b1, b2, b3, ...)
>> 
>> is equivalent to
>> 
>> f(a1, a2, a3, ..., b1, b2, b3, ...)
>> 
>> (2)
>> 
>> If you stick a function into an instance
>> 
>> a.f = f
> 
> 
>> 
>> the call
>> 
>> a.f()
>> 
>> will not automagically pass self as the first argument.
>> 
> The drawback would be, that
> b = A(123)
> b.f()
> would still be called with a as bound object.

There is no b.f until you explicitly assign it with

b.f = f

If you want the function to work uniformly across all instances of the class 
you are better off with adding it to the class

def f(self, x, y):
    ...

A.f = f

However, if you want x to have a fixed value -- that is beyond the 
capabilities of functols partial. You have to wrap f in another function:

A.f = lambda self, y: f(self, 42, y)

Peter




More information about the Python-list mailing list