dynamic function add to an instance of a class
Peter Otten
__peter__ at web.de
Thu Apr 29 04:43:38 EDT 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