Peter Otten wrote:
> [EMAIL PROTECTED] wrote:
>
> You define one base type with a custom metaclass and inherit from that. Your
> example then becomes:
>
> import sys
>
> class ExposedType( type ):
>     def __init__( cls, *args, **kw ):
>         # Track marked exposed methods
>         cls.s_exposedMethods = []
>         for superclass in cls.__mro__:
>             for name, meth in superclass.__dict__.items():
>                 if hasattr( meth, "exposed" ):
>                     cls.s_exposedMethods.append( name )
>
> class Exposed:
>     __metaclass__ = ExposedType
>     def getExposedMethods(self):
>         return self.s_exposedMethods
>     def bar(self):
>         print "bar\n"
>     @staticmethod
>     def expose( f ):
>         f.exposed = True
>         return f
>
> class Process( Exposed):
>     @Exposed.expose
>     def foo( self ):
>         pass
>     def bar( self ):
>         print "BAR"
>
>
> class BotProcess( Process ):
>     @Exposed.expose
>     def addBots( self ):
>         pass
>
> p = Process()
> p.bar()
>
> This prints "BAR" as expected.
>
> Peter

Thanks Peter.  Yeah I had thought of that earlier, but wasn't sure if
this is a standard design pattern for what I'm trying to achieve.  It
seems ugly to me to use 2 classes when you are essentially describing a
single type.  Is the Splat/SplatType pairing really a common design
pattern when trying to use metaclasses in this way?

Also ... as for the 'inspect' based solution, yeah I can see that would
work, but it seems very hacky to me and my gut reaction is to avoid
that kind of thing ...

Cheers,
Glen

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to