Gate class and Subclasses: OOP Practice
A logic gate is a physical device that creates the functional equivalent of a logic operation in code [and, or, not]. It takes some number of input values, such as two values for and (input1 and input2), and produces a single output value. Write the Gate classes required to make the following test function work properly.
def getLocalMethods(clss):
import types
# This is a helper function for the test function below.
# It returns a sorted list of the names of the methods
# defined in a class.
result = [ ]
for var in clss.__dict__:
val = clss.__dict__[var]
if (isinstance(val, types.FunctionType)):
result.append(var)
return sorted(result)
def testGateClasses():
print("Testing Gate Classes... ", end="")
# require methods be written in appropriate classes
assert(getLocalMethods(Gate) == ['__init__', '__str__',
'numberOfInputs', 'setInput'])
assert(getLocalMethods(AndGate) == ['getOutput'])
assert(getLocalMethods(OrGate) == ['getOutput'])
assert(getLocalMethods(NotGate) == ['getOutput', 'numberOfInputs'])
# make a simple And gate
and1 = AndGate()
assert(type(and1) == AndGate)
assert(isinstance(and1, Gate) == True)
assert(and1.numberOfInputs() == 2)
and1.setInput(0, True)
and1.setInput(1, False)
# Hint: to get the name of the class given an object obj,
# you can do this: type(obj).__name__
# You might do this in the Gate.__str__ method...
assert(str(and1) == "And(True,False)")
assert(and1.getOutput() == False)
and1.setInput(1, True) # now both inputs are True
assert(and1.getOutput() == True)
assert(str(and1) == "And(True,True)")
# make a simple Or gate
or1 = OrGate()
assert(type(or1) == OrGate)
assert(isinstance(or1, Gate) == True)
assert(or1.numberOfInputs() == 2)
or1.setInput(0, False)
or1.setInput(1, False)
assert(or1.getOutput() == False)
assert(str(or1) == "Or(False,False)")
or1.setInput(1, True)
assert(or1.getOutput() == True)
assert(str(or1) == "Or(False,True)")
# make a simple Not gate
not1 = NotGate()
assert(type(not1) == NotGate)
assert(isinstance(not1, Gate) == True)
assert(not1.numberOfInputs() == 1)
not1.setInput(0, False)
assert(not1.getOutput() == True)
assert(str(not1) == "Not(False)")
not1.setInput(0, True)
assert(not1.getOutput() == False)
assert(str(not1) == "Not(True)")
print("Passed!")
testGateClasses()
Book class: OOP Practice
Write the Book class so that it passes testBookClass, and
uses the OOP constructs we learned this week as appropriate.
def testBookClass():
print("Testing Book class...", end="")
# A Book has a title, and author, and a number of pages.
# It also has a current page, which always starts at 1. There is no page 0!
book1 = Book("Harry Potter and the Sorcerer's Stone",
"J. K. Rowling", 309)
assert(str(book1) == "Book<Harry Potter and the Sorcerer's Stone by " +
"J. K. Rowling: 309 pages, currently on page 1>")
book2 = Book("Carnegie Mellon Motto", "Andrew Carnegie", 1)
assert(str(book2) == "Book<Carnegie Mellon Motto by Andrew Carnegie: " +
"1 page, currently on page 1>")
# You can turn pages in a book. Turning a positive number of pages moves
# forward; turning a negative number moves backwards. You can't move past
# the first page going backwards or the last page going forwards
book1.turnPage(4) # turning pages does not return
assert(book1.getCurrentPage() == 5)
book1.turnPage(-1)
assert(book1.getCurrentPage() == 4)
book1.turnPage(400)
assert(book1.getCurrentPage() == 309)
assert(str(book1) == "Book<Harry Potter and the Sorcerer's Stone by " +
"J. K. Rowling: 309 pages, currently on page 309>")
book2.turnPage(-1)
assert(book2.getCurrentPage() == 1)
book2.turnPage(1)
assert(book2.getCurrentPage() == 1)
# You can also put a bookmark on the current page. This lets you turn
# back to it easily. The book starts out without a bookmark.
book3 = Book("The Name of the Wind", "Patrick Rothfuss", 662)
assert(str(book3) == "Book<The Name of the Wind by Patrick Rothfuss: " + \
"662 pages, currently on page 1>")
assert(book3.getBookmarkedPage() == None)
book3.turnPage(9)
book3.placeBookmark() # does not return
assert(book3.getBookmarkedPage() == 10)
book3.turnPage(7)
assert(book3.getBookmarkedPage() == 10)
assert(book3.getCurrentPage() == 17)
assert(str(book3) == "Book<The Name of the Wind by Patrick Rothfuss: " + \
"662 pages, currently on page 17, page 10 bookmarked>")
book3.turnToBookmark()
assert(book3.getCurrentPage() == 10)
book3.removeBookmark()
assert(book3.getBookmarkedPage() == None)
book3.turnPage(25)
assert(book3.getCurrentPage() == 35)
book3.turnToBookmark() # if there's no bookmark, don't turn to a page
assert(book3.getCurrentPage() == 35)
assert(str(book3) == "Book<The Name of the Wind by Patrick Rothfuss: " + \
"662 pages, currently on page 35>")
# Finally, you should be able to compare two books directly
book5 = Book("A Game of Thrones", "George R.R. Martin", 807)
book6 = Book("A Game of Thrones", "George R.R. Martin", 807)
book7 = Book("A Natural History of Dragons", "Marie Brennan", 334)
book8 = Book("A Game of Spoofs", "George R.R. Martin", 807)
assert(book5 == book6)
assert(book5 != book7)
assert(book5 != book8)
book5.turnPage(1)
assert(book5 != book6)
book5.turnPage(-1)
assert(book5 == book6)
book6.placeBookmark()
assert(book5 != book6)
print("Done!")