Module Structure/Import Design Problem

Steve Holden steve at holdenweb.com
Thu Nov 20 19:39:46 CET 2008


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)

sholden at lifeboy /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)


sholden at lifeboy /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/




More information about the Python-list mailing list