Some language proposals.

Jacek Generowicz jacek.generowicz at cern.ch
Fri Feb 27 09:19:04 CET 2004


Michael Hudson <mwh at python.net> writes:

> Jacek Generowicz <jacek.generowicz at cern.ch> writes:
> 
> > Michael Hudson <mwh at python.net> writes:
> > 
> > > Jacek Generowicz <jacek.generowicz at cern.ch> writes:

> Ah, ok.  To make it behave like a method, you need to make it a
> descriptor, i.e. implement __get__ (and make everything in sight
> new-style classes, of course).

Yeeees, which is why waaaay upthread I wrote:

> > > > If I were to implement them as instances then I'd have to
> > > > reimplement all the descriptors that take care of turning
> > > > functions into bound or unbound methods.

(although I did misplace the terminology a little, I realize.)

> import types
> 
> class foo(object):
>     pass
> 
> class Callable(object):
>     def __init__(self): # wonder why this is needed:
>         self.__name__ = 'Callable'
>     def __call__(self, ob):
>         return ob
>     def __get__(self, ob, cls=None):
>         return types.UnboundMethodType(self, ob, cls)
>     
> foo.inst = Callable()
> 
> print foo.inst
> print foo().inst()
> 
> (needs 2.3, for 2.2 use new.instancemethod instead).

Aha !

I was doing this stuff way back in 2.2[*], where you get

>>> print foo.inst
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 7, in __get__
TypeError: cannot create 'instance method' instances

but it does indeed work in 2.3. Thanks for pointing that out.

> > Aaah, this thread is an attempt to assimilate me :-)  Now I understand.
> 
> Damn, you noticed.

I'm well on the ball, I am.

Cheers,


[*] Actually, I'm still forced to use 2.2 in production for now.



More information about the Python-list mailing list