Python Macros

Carlos Ribeiro carribeiro at
Tue Oct 5 08:45:05 EDT 2004

On Mon, 04 Oct 2004 23:19:05 -0400, Arich Chanachai
<macrocosm at> wrote:
> Code fragment:
> [Dog fetch:cat]  ---> Dog doesn't know how to fetch cat  --->  Dog
> passes message to human and essentially makes the following call --->
> [Human fetch:cat]  ----> and so forth

Other posters have already pointet out to you some alternatives. If
Dog and Human are both classes, there are many things you can do.

-- If the classes are related in a hierarchy, then the descendent
class will call the superclass method (as in any sane OOP language,
mind you);

-- By providing your own __getattr__ function, you can put yourself in
the position to decide who must fetch the cat. In this case, a code
like this (untested) will do it:

class Human:
    def fetch(self, thing):
        print "Asked to fetch '%s'" % thing
class Dog:
    def __init__(self, owner=None):
        self.owner = owner
    def __getattr__(self, attrname):
        # self.__dict__ contains the local dict of Dog
        message = getattr(self.__dict__, attrname, None)
        if message:
            # message is really a method, anyway...
            return message
            # asks the owner if it supports the message
            return getattr(self. owner, attrname)

>>> joe = Human()
>>> dog = Dog(joe)
>>> dog.fetch('cat')
Asked to fetch 'cat'

The problem with the code above is that joe.fetch() does not know that
the message 'fetch' was deferred from the dog (the value of self is
bound to the 'joe' instance when the object is created). Of course,
there is a lot of things that you can do to solve this problem; for
example, the 'ownership' relationship could be implemented
bidirectionally, so the owner would know that his dog could be asking
him a favour. Another idea is to use MixIns -- classes that than be
added to another class to provide some functionality, but that leads
to a different type of solution architecturally speaking.

Carlos Ribeiro
Consultoria em Projetos
mail: carribeiro at
mail: carribeiro at

More information about the Python-list mailing list