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 -- http://mail.python.org/mailman/listinfo/python-list