Getting in to metaprogramming
Aaron Brady
castironpi at gmail.com
Wed Nov 26 18:59:02 EST 2008
On Nov 26, 10:41 pm, "Hendrik van Rooyen" <m... at microcorp.co.za>
wrote:
> "Steven D'Aprano" <steau> wrote:
>
>
>
> > Well, I don't know about "any problem". And it's not so much about
> > whether metaprograms can solve problems that can't be solved by anything
> > else, as whether metaprograms can solve problems more effectively than
> > other techniques.
>
> > If you include factory functions, class factories, the builder design
> > pattern, metaclasses, etc. as "metaprogramming", then I use it all the
> > time, and find it an excellent technique to use.
>
> > But if you mean using a Python program to generate Python source code,
> > then I can't think of any time I used it. Which doesn't mean that others
> > don't find it helpful, only that I haven't yet.
>
> I am using the term in the restricted sense of Python writing Python source.
>
> Given that, can anybody think of an example that you could not do with
> a class? (excepting the "stored procedure" aspect)
>
> Or can I claim a new a new meta - rule - I would call it van Rooyen's folly...
The example I think of is the Visitor Pattern of Gamma and all. One
class's method calls another's method with its own class's name in the
name.
class Visitor:
def visit_A( self, arg ):...
def visit_B( self, arg ):...
class A:
def visit( self, vis ):
vis.visit_A( self )
class B:
def visit( self, vis ):
vis.visit_B( self )
As you can see, the 'visit' method is mechanical for classes A and B.
One might want to autogenerate those in some languages, but Python has
introspection:
class BaseAB:
def visit( self, vis ):
getattr( vis, 'visit_%s'% self.__class__.__name__ )( self )
And it's easier to modify the default behavior this way than in
autogenerated code too.
More information about the Python-list
mailing list