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

Donnal Walter donnal at donnal.net
Fri Aug 30 17:23:05 CEST 2002


"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



More information about the Python-list mailing list