On Wed, 4 Feb 2009 10:50:47 -0800, Brett Cannon <br...@python.org> wrote:
On Wed, Feb 4, 2009 at 10:43, Steven Bethard <steven.beth...@gmail.com> wrote:
[snip]

Not sure I follow you here. It's not the __init__ that allows you to
do ``x()``, it's the fact that the class declares a __call__, right?

class C(object):
...     pass
...
C.__call__()
<__main__.C object at 0x01A3C370>
C()
<__main__.C object at 0x02622EB0>
str.__call__()
''
str()
''


I don't think so::

Foo.__call__
<method-wrapper '__call__' of type object at 0x81cee0c>
Foo.__call__ = lambda: None
Foo.__call__
<unbound method Foo.<lambda>>
Foo()
<__main__.Foo object at 0xf7f90e8c>

That's because the __call__ special on an instance is ignored, as many
specials on new-style instances are ignored.  If you change the method
where it counts - on type(Foo) in this case - then you see something
different.

   >>> class X(type):
   ...     def __call__(self, *a, **kw):
   ...             print 'X.__call__', a, kw
   ...             return super(X, self).__call__(*a, **kw)
   ...
   >>> class Y(object):
   ...     __metaclass__ = X
... >>> Y.__call__
   <bound method X.__call__ of <class '__main__.Y'>>
   >>> Y()
   X.__call__ () {}
   <__main__.Y object at 0xb7d0706c>
   >>> Y.__call__ = lambda: None
   >>> Y.__call__
   <unbound method Y.<lambda>>
   >>> Y()
   X.__call__ () {}
   <__main__.Y object at 0xb7d0706c>
   >>> X.__call__ = lambda: None
   >>> Y()
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   TypeError: <lambda>() takes no arguments (1 given)
   >>>

As far as I know, Steven Bethard's point is correct.

Jean-Paul
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
http://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to