Metaclass with name overloading.
Carlos Ribeiro
carribeiro at gmail.com
Mon Sep 27 17:44:54 EDT 2004
On Mon, 27 Sep 2004 21:23:14 GMT, Lenard Lindstrom <len-1 at telus.net> wrote:
> Carlos Ribeiro <carribeiro at gmail.com> writes:
> > <sample code snip>
> > The problem is that the methods were not bound to the instance. Adding
> > individual names to each method won't work, because it'll not bind the
> > references stored in the overload_list. I thought about using a
> > closure or curry type of solution, but that's something that I still
> > don't understand very well. Any tips?
> >
> Here is my take on decorator overloaded. I implement OverloadedFunction
> as a descriptor. It supports method binding.
That's what I was missing. I've read about descriptors last week, but
didn't had the time to get a hand at it. It's interesting. My
development machine is still using 2.3 -- I don't know if this
descriptor fancy stuff would work here... *btw, that's why my original
snippet didn't use the new syntax to call the decorator).
I think that this code is now Cookbook-ready. Any comments?
> import sys
>
> class OverloadedFunction(object):
> class BoundMethod:
> def __init__(self, functions, instance, owner):
> self.bm_functions = functions
> self.bm_instance = instance
> self.bm_owner = owner
> def __getitem__(self, index):
> return self.bm_functions[index].__get__(self.bm_instance,
> self.bm_owner)
> def __init__(self):
> self.of_functions = []
> def addFunction(self, func):
> self.of_functions.append(func)
> def __get__(self, instance, owner):
> return self.BoundMethod(self.of_functions,
> instance,
> owner)
>
> def overloaded(func):
> try:
> olf = sys._getframe(1).f_locals[func.__name__]
> except KeyError:
> olf = OverloadedFunction()
> olf.addFunction(func)
> return olf
>
> # Test case:
> class blob:
> def __init__(self, member):
> self.member = member
> @overloaded
> def f(self):
> return "f 0: member=%s" % self.member
> @overloaded
> def f(self, s):
> return "f 1: member=%s, s=%s" % (self.member, s)
>
> b=blob("XXX")
> print b.f[0]()
> print b.f[1]("Yet another f")
>
> ---- Output ---
>
> f 0: member=XXX
> f 1: member=XXX, s=Yet another f
>
>
> Lenard Lindstrom
> <len-l at telus.net>
--
Carlos Ribeiro
Consultoria em Projetos
blog: http://rascunhosrotos.blogspot.com
blog: http://pythonnotes.blogspot.com
mail: carribeiro at gmail.com
mail: carribeiro at yahoo.com
More information about the Python-list
mailing list