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