changing __call__ on demand

Hans Nowak hans at zephyrfalcon.org
Sun Feb 13 13:19:03 EST 2005


Stefan Behnel wrote:
> Hi!
> 
> This somewhat puzzles me:
> 
> Python 2.4 (#1, Feb  3 2005, 16:47:05)
> [GCC 3.3.4 (pre 3.3.5 20040809)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
> 
> .>>> class test(object):
> ...   def __init__(self):
> ...     self.__call__ = self.__call1
> ...   def __call1(self):
> ...     print 1
> ...   def __call__(self):
> ...     print 2
> ...
> .>>> t = test()
> .>>> t()
> 2
> 
> If I take out the __call__ method completely and only set it in 
> __init__, I get a TypeError saying that test is not callable.

Note that it works just fine if you don't use a new-style class:

 >>> class Test:
...     def __init__(self):
...         self.__call__ = self.foobar
...     def foobar(self, *args, **kwargs):
...         print "Called with:", args, kwargs
...
 >>> t = Test()
 >>> t()
Called with: () {}
 >>> t(3, 4)
Called with: (3, 4) {}
 >>> t(42, x=0)
Called with: (42,) {'x': 0}

-- 
Hans Nowak
http://zephyrfalcon.org/




More information about the Python-list mailing list