* Michael Rudolf:
Out of curiosity I tried this and it actually worked as expected:

 >>> class T(object):
    x=[]
    foo=x.append
    def f(self):
        return self.x

>>> t=T()
 >>> t.f()
[]
 >>> T.foo(1)
 >>> t.f()
[1]
 >>>

At first I thought "hehe, always fun to play around with python. Might be useful sometimes" - but then It really confused me what I did. I mean: f is what we call a method, right? But was is foo?

foo is (refers to) an object that supports call notation and that forwards calls somewhere else, in this case to append on a list.

You might call it (descriptive) a call forwarder, or (C# or general terminology) a delegate, or (Python 2.x) a bound method.


<example>
  >>> "Hello".upper
  <built-in method upper of str object at 0x00BA16E0>
  >>> f = "Hello".upper
  >>> f
  <built-in method upper of str object at 0x00BA16E0>
  >>> f()
  'HELLO'
  >>>
  >>>
  >>>
  >>> f.__self__
  'Hello'
  >>> f.__call__
  <method-wrapper '__call__' of builtin_function_or_method object at 0x00BDD170>
  >>> print( f.__doc__ )
  S.upper() -> str

  Return a copy of S converted to uppercase.
  >>> _
</example>


A common use for delegates is as command handlers in a GUI application, and in general for event notifications.


Cheers & hth.,

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

Reply via email to