On 11/04/2014 08:52 AM, Roberto Martínez wrote:
I am trying to replace dinamically the __call__ method of an object
using setattr.
Example:

$ cat testcall.py
class A:
     def __init__(self):
         setattr(self, '__call__', self.newcall)

     def __call__(self):
         print("OLD")

     def newcall(self):
         print("NEW")

a=A()
a()

I expect to get "NEW" instead of "OLD", but in Python 3.4 I get "OLD".

Given that special methods can only be replaced on the class and not the instance, you could create a new version of the class within __init__ and assign it to the instance:

    class A:
        def __init__(self, call_method=None):
            if call_method:
                methods = {'__call__': call_method}
                self.__class__ = type('Custom_A', (A,), )

        def __call__(self):
            return 'original'

    >> a = A()
    >> a()
    "old"
    >> b = A(lambda self: 'new')
    >> b()
    "new"
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to