Nikolaus Rath schrieb:
Hi,

I want to monkeypatch an object so that it becomes callable, although
originally it is not meant to be. (Yes, I think I do have a good reason
to do so).

But simply adding a __call__ attribute to the object apparently isn't
enough, and I do not want to touch the class object (since it would
modify all the instances):

class foo(object):
...   pass
...
t = foo()
def test():
...   print 'bar'
...
t()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'foo' object is not callable
t.__call__ = test
t()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'foo' object is not callable
t.__call__()
bar


Is there an additional trick to get it to work?

AFAIK special methods are always only evaluated on the class. But this works:

class Foo(object):

    pass

f = Foo()

def make_callable(f):
    class Callable(f.__class__):

        def __call__(self):
            print "foobar"

    f.__class__ = Callable

make_callable(f)
f()

Diez
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to