From: Richard Lamboj on 29 Apr 2010 04:44 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 29 Apr 2010 04:43 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 29 Apr 2010 05:05 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.
First
|
Prev
|
Pages: 1 2 Prev: help req installing python 2.6 Next: matching strings in a large set of strings |