spell method chaining?

Remco Gerlich scarblac at pino.selwerd.nl
Fri Jun 8 13:10:08 EDT 2001


Robin Becker <robin at jessikat.fsnet.co.uk> wrote in comp.lang.python:
> I wish to create wrapped classes dynamically and have the wrapper class
> refer to the base wrapee class methods.
> 
> def gen(B):
>     class W(B):
>         def __init__(self):
>             B.__init__(self)
>     return W
> 
> this works if nested scopes is on so that the reference to B in the
> __init__ refers to the argument of gen, but it fails without it unless B
> happens to be a global. I thought of using self.__class__.__bases__[0]
> to refer to the dynamic base B, but then that fails if I use the
> resultant class as a base class.
> 
> ie if I try
> 
> def gen(B):
>     class W(B):
>         def __init__(self):
>             self.__class__bases__.__init__(self)
>     return W
> 
> I get trouble (infinite looping) with gen(gen(B))()
> 
> What is the correct way for dynamic classes to refer to their immediate
> base class methods to allow method chaining etc.

Usually you know that the base class is called eg Klass, and you simply call
that. In this case I think you have to store it inside the class manually,
like this:

def gen(B):
   class W(B):
      def __init__(self):
         self.__base.__init__(self)
   W._W__base = B
   return W

(not the automatic 'name munging' the self.__base does, this way the
attribute is somewhat protected from classes inheriting it)

This is a bit of a hack, but then what you're doing isn't all that common
and it's fixed with nested scopes anyway.

-- 
Remco Gerlich



More information about the Python-list mailing list