Re: dynamic function add to an instance of a class



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

.



Relevant Pages