Python Macros
Carlos Ribeiro
carribeiro at gmail.com
Tue Oct 5 08:45:05 EDT 2004
More information about the Python-list mailing list
Tue Oct 5 08:45:05 EDT 2004
- Previous message (by thread): Python Macros
- Next message (by thread): Python Macros
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On Mon, 04 Oct 2004 23:19:05 -0400, Arich Chanachai <macrocosm at fastmail.fm> 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 else: # 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 blog: http://rascunhosrotos.blogspot.com blog: http://pythonnotes.blogspot.com mail: carribeiro at gmail.com mail: carribeiro at yahoo.com
- Previous message (by thread): Python Macros
- Next message (by thread): Python Macros
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list