instance/class methods: having my cake and eating it too

Thomas Heller theller at python.net
Fri Aug 30 11:38:54 EDT 2002


"Donnal Walter" <donnal at donnal.net> wrote in message news:918bc22f.0208300723.5d7df621 at posting.google.com...
> "Thomas Heller" <theller at python.net> wrote:
> > Classes deriving from object can completely customize
> > the binding process by implementing a __get__ method:
> >
> > class _BoundMethod:
> >     # Helper class.
> >     def __init__(self, func, first):
> >         self.func = func
> >         self.first = first
> >
> >     def __call__(self, *args):
> >         return self.func(self.first, *args)
> >
> > class unimethod(object):
> >     # universal method: binds to either a class or an instance
> >     def __init__(self, func):
> >         self.func = func
> >
> >     def __get__(self, inst, type=None):
> >         if inst is None:
> >             # bind to the class
> >             return _BoundMethod(self.func, type)
> >         else:
> >             # bind to the instance
> >             return _BoundMethod(self.func, inst)
> >
> > Then you can do:
> >
> > class Decimal:
> >     ...
> >     def SetDigits(cls_or_inst, ...):
> >         ....
> >
> >     SetDigits = unimethod(SetDigits)
> >
> > -----
> >
> > Thomas
>
> Thank you for this answer. It is *exactly* what I was looking for. I
> had previously studied PEP 252 and other documentation related to it,
> but somehow I don't think I ever would have come up with this solution
> on my own. Now that I have seen your working example, however, I
> understand better how descriptors work, and I thank you very much.
>
> Donnal
The most useful reading about this stuff I found is Guido's introduction
http://www.python.org/2.2.1/descrintro.html.

Although, unfortunately, still some important stuff is missing,
see the 'Additional Topics' section at the end.

Thomas





More information about the Python-list mailing list