Assignment 5: Class Folders
Due to CMS by Thursday, November 6th at 11:59 pm.
This is a written assignment similar to Assignment 2. Yes,
you will diagram a few more call frames. But this time we are more concerned with folders:
both object and class folders. The purpose of this assignment is to help you understand
the issues with name resolution that we discussed in class.
This assignment is going to overlap Assignment 4 and
Assignment 6. That means we have posted it before Assignment 4 is due
and will post Assignment 6 before this assignment is due. That is because we have the
second prelim coming up and we want you to get started on the first part (not all) of
Assignment 6 before the prelim. As this is a written assignment, and you already have
a lot of experience with call frames, this should not be a problem.
Learning Objectives
This assignment is design to help you understand the following concepts.
-
How to draw object folders to represent the contents of an instance.
-
How to draw class folders to represent the shared content of all instances.
-
How object and class folders are used to resolve naming issues.
-
How method calls are similar to function calls.
Table of Contents
Authors: W. White, L. Lee, S. Marschner
Academic Integrity and Collaboration
Academic Integrity
This assignment is a brand new assignment, so there are no solutions from previous
semesters. However, the standard rules in
CS1110's academic
integrity policies still apply. If you collaborate with anyone who is not
your partner, then you must cite this collaboration in your submission.
Collaboration Policy
You may do this assignment with one other person. If you are going to work together, then
form your group on CMS as soon as possible. This must be completed before you
submit the assignment. Both people must do something to form the group. The first
person proposes, and then the other accepts. You do not need to have the same
partner as last time; you can change your partner with each assignment.
If you do this assignment with another person, you must work together. It is against the
rules for one person to to fill out this assignment and just have the other person put
their name at it. You should actively collaborate on this assignment. If you collaborate
with anyone other than this partner, we reserve the right to assign a grade penalty
(even if you cite them).
Using the Online Python Tutor
By now, everyone is very familiar with the
Online Python Tutor.
Once again, using the Tutor makes parts of (but not all of) this assignment easy. We
are perfectly okay with this. It is a good way to help you understand the formalism
if you are particularly lost.
If you used the Python Tutor to help you with part of the problem, please cite this
(for each part that you used it) in your submission.
We will not take off any points if you use the Tutor and cite it. We only
require a citation because it is part of our
Academic Integrity Policy.
Getting Help
Even though this is just a written assignment, some of you may still have some
difficulty with it. You might not completely understand how method calls work
or the difference between the two folders. If you are lost, please see someone
in the course staff.
This can be the course instructor, a TA, or a consultant. Furthermore, do not
wait until the last minute, as the course staff is generally overwhelmed
just before an assignment deadline.
Diagramming Conventions
You are already familiar with most of diagramming conventions from
Assignment 2. Our new conventions build on top
of these. All of our examples below use the following example
class Example(object):
CONST=3
def __init__(self):
1. pass
def foo(self):
1. return 42
The red numbers are line numbers for the purposes of method call frames. To make things
easier (and more familiar to you), we always assume the first line of a method is line
number 1.
Diagramming Class Folders
When you define a class, Python creates a special folder called a class folder
that stores the information about that class. Technically, Python also creates a global
variable with the same name as the class and puts the name of that folder in the global
variable; that is what you see when you put the class above in the Python visualizer.
To simplify things, we do not want you to show the variable in global space (just like
we never ask you to show the variable for a function name in global space). We just
want you create a folder in heap space, and put the name of the class in the tab. We also
want you to put the tab on the right so that we can tell this is a class folder. This
is illustrated below.
The class folder contains all the methods and any class attributes. In a class definition,
any assignment statement outside of a method definition creates a class attribute. In
the example above, CONST is a class attribute.
Technically, the methods are also variables themselves. This is what you would see if
you used the Python visualizer. However, the contents of this variable are really
complicated, and the Python visualizer just writes the method header (the name plus
all of its parameters) as its value. Therefore, that is what we want you to
write for the methods in a class: the method header.
The example above works when the class is a base case (e.g. a subclass of class
object). Suppose we have a class that is a subclass of a user-defined class,
like the example Demo below.
class Demo(Example):
pass
We want to indicate this relationship in our class folders. To do this, we put the name
of the parent class in parentheses, as shown below. Note that this class has no methods
or class attributes in it, because there are none in the class definition.
Diagramming Object Folders
A object is instance of a class. While there is only one class Example,
there may be more than one Example object. Each time you call the constructor,
you create a new object. For example, suppose we execute the following statements:
e = Example()
e.x = 10
The constructor for Example creates an empty folder (why?), while the second
assignment statement adds an attribute x to the folder. The end result is
as follows:
The instance folder only contains attributes added to the instance. It does not contain
class attributes, and (for this course) it never contains methods.
Diagramming Method Calls
A method class works almost exactly like a function call. You create the call
frame, and plug the arguments into the parameters. You then execute each line in the
method, changing the call frame as necessary. Finally, you erase the frame.
The only real difference is the function name that goes in the upper left box. We
want both the name of the class and the method name in this box. For example.
for the method call
e.foo()
the initial diagram for the call frame is as follows
Note the name is not foo in the top left folder, but Example.foo.
That tells us to use the version of foo that is stored in the class folder
Example.
Diagramming Constructor Calls
A constructor is just a function, so Python should create a call frame when it is called.
However, this function is built-in, so we do not really know what it looks like. You will
notice that the Python visualizer does not create a call frame for the constructor either.
However, it does create a call frame for the initializer __init__, which the
constructor uses as a helper.
We are going to do it the way that the Python visualizer does it. Remember the 4 steps
of a constructor call:
- It creates a new empty folder of that class.
- It puts the folder into heap space
- It executes the method __init__ (creating a call frame)
- It returns the folder name
In our diagram, we combine steps 1 and 2 (because otherwise we do not know where to put
the folder). We also combine step 4 with the erasing step of __init__ even
though __init__ has no return variable. For example, if we executed
the constructor
e = Example()
The resulting diagram would be as follows.
The first diagram is the folder creation step, before the method __init__ is
called. The next two diagrams are for the call frame for __init__. The first
picture is at the start of the method, and the second picture is the execution of the
one an only line of the method (which does nothing). In the final diagram, we erase
the frame and assign the value to our variable.
Assignment Instructions
This entire assignment will involve the following two mysterious (and undocumented) classes.
class A(object):
x=3
y=5
def __init__(self,y):
1. self.y = y
def f(self):
1. return self.y+self.y
def g(self):
1. return self.x+self.y
|
class B(A):
y=4
z=10
def __init__(self,x,y):
1. self.x = x
2. A.__init__(self,y+1)
def f(self):
1. a = self.g()
2. return self.z+a
|
The red numbers are line numbers for the purposes of method call frames. To make things
easier (and more familiar to you), we always assume the first line of a method is line
number 1. We have kept all of these methods short to cut down on the amount that you
have to draw.
Part A: Diagram the two Class Folders
The instructions are in them title for this section. We just want you to draw two
class folder. Once for the class A and another for the class B .
Do not draw global space (even though there are global variables A and
B that refer to these class folders). There is also no call frame to draw.
Part B: Diagram the Execution of p = A(1)
Draw the execution of the statement p = A(1) . This is a constructor
call, so it will involve the creation of a call frame for __init__ .
As usual, you will need a diagram for when the frame for __init__ created,
and another when it is erased. In between, you will diagram the lone line of code that
is executed.
However, as described above, you do not draw the call frame right away.
You need a step creating the folder first. In particular, you will need to draw how
global space and heap space changes with the call frame, just like you did on the prelim.
You do not need to add anything to global space beyond what is required for the
statement p = A(1) . In particular, you do not need a global variable for
class A .
Part C: Diagram the Execution of q = B(7,3)
This problem is exactly like Part B. We need the evolution
of the global space, heap space, and the call frame for __init__ . The
difference this time is that there is a call stack created with more than one frame
(just like on the first prelim). You should draw that properly.
You do not need to include p (from Part B) in your diagram of global
space.
Part D: Diagram the Execution of r = q.f()
In this problem, q is the variable from Part C. Diagram
the evolution of the call frame for method f . This is a normal method call
(not a constructor), as described above. If this method calls another
method as a helper, you should draw the complete call stack, just like you did in the
previous problem.
Your diagrams should include the contents of global space at each step. You do not need
to draw heap space, since method f will not change the contents of any
folder.
Finishing the Assignment
When you finish the assignment, put your name and netid at the top of
the page. Otherwise, we will not know that the assignment is yours, and we
cannot give you credit for your work. If you are working with a partner,
then the partner's name must be on the assignment as well. In addition,
to help us out with organization, please underline your last name(s).
As with Assignment 2, we want you to submit
this assignment online through CMS. The process is the same as for that
assignment. If you created your assignment on a computer, convert the
file to a PDF. Otherwise, you will need to scan your paper. There are
scanners in
Olin and Uris Library to help you with this.
Your submission must be uploaded to CMS by Thursday, November 6th at 11:59 pm. If you
are planning to scan your submission, we recommend that you finish
long enough ahead of time to give you time to scan.
Survey
Once again, this assignment comes with a survey on CMS. This survey asks
how long you spent on the assignment, your impression of the difficulty,
and what could be done to improve it.
Please try to complete the survey within a day of turning in this assignment.
Remember that participation in surveys compromise 1% of your final grade.
We also ask that you be honest in your answers.
|