Stage 1. ---------------------------------------------------(we might have a pre stage to this too)--------------------- -bash-3.2$ ls -ld template.py one -rwx------ 1 dgerman faculty 37 Jul 6 04:28 one -rw-r--r-- 1 dgerman faculty 14 Jul 6 04:27 template.py -bash-3.2$ cat template.py print "Hello" -bash-3.2$ cat one #!/usr/bin/python import template -bash-3.2$ ./one Hello -bash-3.2$ Stage 2. --------------------------------------------------------------------------------------------------------------- -bash-3.2$ ls one template.py template.pyc -bash-3.2$ ls -l total 24 -rwx------ 1 dgerman faculty 96 Jul 6 04:36 one -rw-r--r-- 1 dgerman faculty 182 Jul 6 04:30 template.py -rw-r--r-- 1 dgerman faculty 684 Jul 6 04:32 template.pyc -bash-3.2$ cat template.py class Engine(object): def __init__(self): print "New engine created." def start(self): print "I am starting now." def fun(self): print "This is the default fun." -bash-3.2$ cat one #!/usr/bin/python import template class One(template.Engine): pass one = One() one.start() -bash-3.2$ ./one New engine created. I am starting now. -bash-3.2$ Stage 3. --------------------------------------------------------------------------------------------------------------- -bash-3.2$ cat template.py class Engine(object): def __init__(self): print "New engine created." def start(self): print "I am starting now." self.fun() def fun(self): print "This is the default fun." -bash-3.2$ cat one #!/usr/bin/python import template class One(template.Engine): pass one = One() one.start() -bash-3.2$ ./one New engine created. I am starting now. This is the default fun. -bash-3.2$ Stage 4. --------------------------------------------------------------------------------------------------------------- -bash-3.2$ cat template.py class Engine(object): def __init__(self): print "New engine created." def start(self): print "I am starting now." self.fun() def fun(self): print "This is the default fun." -bash-3.2$ cat one #!/usr/bin/python import template class One(template.Engine): def fun(self): print "I am the new fun." one = One() one.start() -bash-3.2$ ./one New engine created. I am starting now. I am the new fun. -bash-3.2$ Minor modification: -bash-3.2$ ls -ld template.py -rw-r--r-- 1 dgerman faculty 199 Jul 6 08:31 template.py -bash-3.2$ cat template.py class Engine(object): def __init__(self): print "New engine created." def execute(self): print "I am starting now." self.fun() def fun(self): print "This is the default fun." -bash-3.2$ ls -ld one -rwx------ 1 dgerman faculty 138 Jul 6 08:31 one -bash-3.2$ cat one #!/usr/bin/python import template class One(template.Engine): def fun(self): print "I am the new fun." one = One() one.execute() -bash-3.2$ ./one New engine created. I am starting now. I am the new fun. -bash-3.2$ Stage 5. --------------------------------------------------------------------------------------------------------------- -bash-3.2$ ls -ld template.py -rw-r--r-- 1 dgerman faculty 553 Jul 6 08:38 template.py -bash-3.2$ cat template.py class Engine(object): def __init__(self): print "New engine created." def execute(self): s = self.retrieveState() if s.isEmpty(): self.initializeState(s) else: self.updateState(s) self.saveState(s) self.reportState(s) self.getReadyforMoreInput() def retrieveState(self): return State() def initializeState(self, s): pass def saveState(self, s): pass def reportState(self, s): pass def getReadyforMoreInput(self): pass class State(object): def isEmpty(self): return True -bash-3.2$ ls -ld one -rwx------ 1 dgerman faculty 138 Jul 6 08:31 one -bash-3.2$ cat one #!/usr/bin/python import template class One(template.Engine): def fun(self): print "I am the new fun." one = One() one.execute() -bash-3.2$ ./one New engine created. -bash-3.2$ Stage 6 (final stage). -------------------------------------------------------------------------------------------------- -bash-3.2$ ls -l total 24 -rwx------ 1 dgerman faculty 2541 Jul 6 09:28 one -rw-r--r-- 1 dgerman faculty 656 Jul 6 09:26 template.py -rw-r--r-- 1 dgerman faculty 1666 Jul 6 09:27 template.pyc -bash-3.2$ cat template.py import cgi class Engine(object): def __init__(self): # print "New engine created." self.input = cgi.FieldStorage() def execute(self): s = self.retrieveState() if s.isEmpty() or self.reset(): self.initializeState(s) else: self.updateState(s) self.saveState(s) self.reportState(s) self.getReadyforMoreInput() def retrieveState(self): return State() def initializeState(self, s): pass def saveState(self, s): pass def reportState(self, s): pass def getReadyforMoreInput(self): pass def reset(self): return False class State(object): def isEmpty(self): return True -bash-3.2$ -bash-3.2$ cat one #!/usr/bin/python import template, random class One(template.Engine): def __init__(self): template.Engine.__init__(self) def retrieveState(self): # print "I am retrieving state..." (message, n1, n2, m1, m2) = ("", "", "", "", "") if self.input.has_key("message"): message = self.input["message"].value if self.input.has_key("n1"): n1 = self.input["n1"].value if self.input.has_key("n2"): n2 = self.input["n2"].value if self.input.has_key("m1"): m1 = self.input["m1"].value if self.input.has_key("m2"): m2 = self.input["m2"].value return MyState(message, n1, n2, m1, m2) def reset(self): reset = "" if self.input.has_key("reset"): reset = self.input["reset"].value return reset def initializeState(self, s): # print "I am being asked to initialize the state..." s.message = "Welcome" s.n1 = str(random.randrange(-50, 50)) s.n2 = str(random.randrange(-50, 50)) s.m1 = "0" s.m2 = "0" def updateState(self, s): # print "I am being asked to update the state based on input..." answer = "" if self.input.has_key("answer"): answer = self.input["answer"].value if answer and int(answer) == int(s.n1) + int(s.n2): s.message = "Very good." s.m1 = str(int(s.m1) + 1) else: s.message = "No, no, no." s.m2 = str(int(s.m2) + 1) s.message += "Score now: " + s.m1 + " out of " + s.m2 s.n1 = str(random.randrange(-50, 50)) s.n2 = str(random.randrange(-50, 50)) def saveState(self, s): print "
" class MyState(template.State): def __init__(self, message, n1, n2, m1, m2): self.message = message self.n1 = n1 self.n2 = n2 self.m1 = m1 self.m2 = m2 def isEmpty(self): # print "I am being asked if I am empty..." return not self.message print "Content-type: text/html\n\n" one = One() one.execute() -bash-3.2$ My program works at: http://silo.cs.indiana.edu:44063/cgi-bin/0706/one