Rafe wrote: > Hi, > > I am in a situation where I feel I am being forced to abandon a clean > module structure in favor of a large single module. If anyone can save > my sanity here I would be forever grateful. > > My problem is that classes in several modules share a common base > class which needs to implement a factory method to return instances of > these same classes. > > An example to help illustrate what I mean: > Lets say I have the following modules with the listed classes: > - baselib.py with BaseClass > - types.py with TypeA, ... > - special.py with SpecialTypeA, ... > > Which would be used a bit like this: >>>> type_a = any_type_instance.get_type("TypeA") >>>> special_type = type_a.get_type("SpecialTypeA") > > > Again, I can get around this by dumping everything in to one module, > but it muddies the organization of the package a bit. This seems like > a problem that would come up a lot. Are there any design paradigms I > can apply here? > Well a simple way to do this is to observe that even when a base class's method is inherited by an instance of a subclass, when the method is called the type of "self" is the subclass. And you can call the subclass's type to create an instance. Perhaps the following code would make it more obvious:
$ cat baseclass.py class Base(object): def factory(self, arg): return type(self)(arg) [EMAIL PROTECTED] /c/Users/sholden/Projects/Python $ cat subclass.py from baseclass import Base class sub(Base): def __init__(self, arg): print "Creating a sub with arg", arg s = sub("Manual") thing = s.factory("Auto") print type(thing) [EMAIL PROTECTED] /c/Users/sholden/Projects/Python $ python subclass.py Creating a sub with arg Manual Creating a sub with arg Auto <class '__main__.sub'> Hope this helps. regards Steve -- Steve Holden +1 571 484 6266 +1 800 494 3119 Holden Web LLC http://www.holdenweb.com/ -- http://mail.python.org/mailman/listinfo/python-list