From: Richard Lamboj on

Am Thursday 29 April 2010 10:13:01 schrieb Peter Otten:
> 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.
>
> Peter

Thats what i want:

from functools import partial

class A(object):
def add_function(self, function_name, value):
setattr(self, function_name, partial(self.test, value))

def test(self, value):
print value


a = A()
a.add_function("func1", "value1")
a.func1()

Thanks to all for helping me!

Kind Regard,

Richi
From: Peter Otten on
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

From: News123 on
Peter Otten wrote:
> News123 wrote:

>>>
>> 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

you are sooo right.
My fault.