Download presentation
Presentation is loading. Please wait.
1
EECS 110: Lec 14: Classes and Objects
Aleksandar Kuzmanovic Northwestern University
2
“Quiz” def favChild( person, Tree ): if person in Tree: Kids = Tree[person] Kids.sort() return Kids[0] else: return 'no children' Change this code so that it keeps track of how many times you've guessed each item. first, for real provinces then, for incorrect guesses… Based on favChild, write favGChild to return the first grandchild alphabetically - or return 'no one' if there are none. def provinceChallenge( prov ): while 0 in prov.values(): guess = input("Guess: ") if guess not in prov: print('Try again...’) elif prov[guess] == 0: print('Yes!’) prov[guess] += 1 else: print('Already guessed...') def favGChild( person, Tree ):
3
def provinceChallenge( prov ): while 0 in prov.values():
Change this code so that it tells you how many times you've guessed the same province… first, for real provinces then, for incorrect guesses… def provinceChallenge( prov ): while 0 in prov.values(): guess = input("Guess: ") if guess not in prov: print('Try again... ’) elif prov[guess] == 0: print('Yes!’) prov[guess] += 1 else: print('Already guessed...‘)
4
def provinceChallenge( prov ): prov['incorrect']=0
Change this code so that it tells you how many times you've guessed the same province… first, for real provinces then, for incorrect guesses… def provinceChallenge( prov ): prov['incorrect']=0 while 0 in prov.values(): guess = input("Guess: ") if guess not in prov: print('Try again... ’) prov['incorrect'] += 1 elif prov[guess] == 0: print('Yes!’) prov[guess] += 1 else: print('Already guessed...‘)
5
def favChild( person, Tree ):
if person in Tree: Kids = Tree[person] Kids.sort() return Kids[0] else: return 'no children' Based on favChild, write favGChild to return the first grandchild alphabetically - or return 'no one' if there are none.
6
def favGChild( person, Tree ): gChildren = [] if person in Tree :
def favChild( person, Tree ): if person in Tree: Kids = Tree[person] Kids.sort() return Kids[0] else: return 'no children' Based on favChild, write favGChild to return the first grandchild alphabetically - or return 'no one' if there are none. def favGChild( person, Tree ): gChildren = [] if person in Tree : for child in Tree[person]: if child in Tree: gChildren += Tree[child] if gChildren == []: return 'no one' else: gChildren.sort() return gChildren[0]
7
A whole new class of programming
EECS 110 today A whole new class of programming The Date class HW6 Details Pr1 (the Date class) Lab and HW #6 Pr2 (the Connect4Board) Pr3 (the Connect4Player (e.c.)) Due Sunday Projects Projects Final! Fri., 5/19: online Fri., 5/26: recitation Tue., 5/30: recitation, W. lab Wed., 5/24: rev. for final Wed., 5/31, final Mon., 5/22: class
8
Lists, Tuples, Dictionaries, …
+ lots of computer work for the programmer's work! e.g., the Simpson's dictionary… T = {'abe' :['homer','herb'], 'jackie':['marge','patty','selma'], 'homer' :['hugo','bart','lisa','maggie'], 'marge' :['hugo','bart','lisa','maggie']} We can use built-in functions, etc.
9
Lists, Tuples, Dictionaries, …
+ lots of computer work for the programmer's work! fairly generic capabilities, e.g., len, print - limited to square-bracket naming, e.g., A[i] no options as to data organization… A = [ 42, 3.1, '!'] 42 3.1 '!' list int float str A A[0] A[1] A[2] T = {'abe' :['homer','herb'],…} T.getChildren('abe') NOT POSSIBLE! have to use T['abe']
10
+ - Lists, Tuples, Dictionaries, …
lots of computer work for little programmer work! fairly generic capabilities, e.g., len, print - limited to square-bracket naming, e.g., A[i] no options as to data organization… A = [ 42, 3.1, '!'] 42 3.1 '!' list int float str A A[0] A[1] A[2] Classes and Objects take care of all 3 drawbacks...
11
(1) A class is a type of variable.
Classes & Objects An object-oriented programming language allows you to build your own customized types of variables. (1) A class is a type of variable. (2) An object is one such variable. There will typically be MANY objects of a single class.
12
Python's class libraries…
Examples… Graphics libraries Python's class libraries…
13
A particularly complex example…
Using objects and classes: A particularly complex example… >>> z = 3 + 4j >>> dir(z) all of the data members and methods of the complex class (and thus the object z !) >>> z.imag 4.0 >>> z.conjugate() 3-4j a data member of all objects of class complex its value for this object, z a method (function) within all objects of class complex its return value for this object, z
14
Objects An object is a data structure (like a list), except
(1) Its data elements have names chosen by the programmer. (2) Data elements are chosen & organized by the programmer (3) An object can have behaviors built-in by the programmer.
15
usually called "methods" instead of functions
Objects An object is a data structure (like a list), except (1) Its data elements have names chosen by the programmer. (2) Data elements are chosen & organized by the programmer (3) An object can have behaviors built-in by the programmer. usually called "methods" instead of functions
16
Date >>> d = Date(1,1,2016) >>> d 1/1/2016
This is a class. It is a user-defined datatype (that you'll build in Lab this week!) >>> d = Date(1,1,2016) >>> d 1/1/2016 this is a CONSTRUCTOR … this is an object of type Date the representation of a particular object of type Date >>> d.isLeapYear() True the isLeapYear method returns True or False. How does it know what year to check? >>> d2 = Date(12,31,2017) >>> d2 12/31/2017 >>> d2.isLeapYear() False Another object of type Date - again, via the constructor. How does it know to return False, instead of True in this case ??
17
The Date class class Date: """ a blueprint (class) for objects
that represent calendar days """ def __init__( self, mo, dy, yr ): """ the Date constructor """ self.month = mo self.day = dy self.year = yr def __repr__( self ): """ used for printing Dates """ s = "%02d/%02d/%04d" % (self.month, self.day, self.year) return s def isLeapYear( self ): """ anyone know the rule? """ The Date class
18
is the specific OBJECT THAT CALLS A METHOD
self is the specific OBJECT THAT CALLS A METHOD >>> d = Date(1,1,2016) >>> d 1/1/2016 These methods need access to the object that calls them >>> d.isLeapYear() True >>> d2 = Date(12,31,2017) >>> d2 12/31/2017 >>> d2.isLeapYear() False These methods need access to the object that calls them
19
a Leap of faith…. class Date: def isLeapYear( self ):
def __init__( self, mo, dy, yr ): (constructor) def __repr__(self): (for printing) def isLeapYear( self ): """ here it is """ if self.year%400 == 0: return True if self.year%100 == 0: return False if self.year%4 == 0: return True return False
20
Date >>> d = Date(1,1,2017) >>> d 1/1/2017
always created with the CONSTRUCTOR … >>> d.yesterday() >>> d 12/31/2016 >>> d.subNDays(35) lots of printing… the yesterday method returns nothing at all. Is it doing anything? d has changed! Why is this important? Some methods return a value; others change the object that call it!
21
Date ids >>> d = Date(11,10,2017) >>> d 11/10/2017
11/11/2017 this initializes a different Date! >>> d == d2 ? >>> d2.yesterday() >>> d == d2 ?
22
Date ids >>> d = Date(11,10,2017) >>> d 11/10/2017
11/11/2017 this initializes a different Date! >>> d == d2 False >>> d2.yesterday() >>> d == d2 ?
23
Date ids >>> d = Date(11,10,2017) >>> d 11/10/2017
11/11/2017 this initializes a different Date! >>> d == d2 False >>> d2.yesterday() >>> d == d2 False
24
Double Date >>> d = Date(11,10,2017) >>> d
11/10/2017 >>> d.addNDays(36) >>> d2 ? >>> d2 = d.copy() >>> d2 == d >>> d.equals(d2)
25
Double Date >>> d = Date(11,10,2017) >>> d
11/10/2017 >>> d.addNDays(36) >>> d2 12/16/2017 >>> d2 = d.copy() >>> d2 == d ? >>> d.equals(d2)
26
Double Date >>> d = Date(11,10,2017) >>> d
11/10/2017 >>> d.addNDays(36) >>> d2 12/16/2017 >>> d2 = d.copy() >>> d2 == d False >>> d.equals(d2) ?
27
Double Date >>> d = Date(11,10,2017) >>> d
11/10/2017 >>> d.addNDays(36) >>> d2 12/16/2017 >>> d2 = d.copy() >>> d2 == d False >>> d.equals(d2) True
28
More Date class Date: def copy(self):
def __init__( self, mo, dy, yr ): def __repr__(self): def isLeapYear(self): def copy(self): """ returns a DIFFERENT object w/SAME date! """ def equals(self, d2): """ returns True if they represent the same date; False otherwise """
29
More Date class Date: def copy(self):
def __init__( self, mo, dy, yr ): def __repr__(self): def isLeapYear(self): def copy(self): """ returns a DIFFERENT object w/SAME date! ""“ return Date(self.month, self.day, self.year) def equals(self, d2): """ returns True if they represent the same date; False otherwise """
30
More Date class Date: def copy(self):
def __init__( self, mo, dy, yr ): def __repr__(self): def isLeapYear(self): def copy(self): """ returns a DIFFERENT object w/SAME date! ""“ return Date(self.month, self.day, self.year) def equals(self, d2): """ returns True if they represent the same date; False otherwise ""“ return self.month == d2.month and self.day == d2.day and self.year == d2.year
31
"Quiz" class Date: def isBefore(self, d2):
""" if self is before d2, this should return True; else False """ if self.year < d2.year: return True if self.month < d2.month: return True if self.day < d2.day: return True return False def tomorrow(self): """ moves the date that calls it ahead 1 day """ DIM = [0,31,28,31,30,31,30,31,31,30,31,30,31] "Quiz" This method is WRONG! Find why … and suggest how you could fix it! Write this tomorrow method. It does not return anything. It just CHANGES the date object that calls it.
32
""" if self is before d2, this should return True; else False """
class Date: def isBefore(self, d2): """ if self is before d2, this should return True; else False """ if self.year < d2.year: return True if self.month < d2.month: return True if self.day < d2.day: return True return False What's wrong? 5/1/2017 vs 8/1/2010 won’t work correctly.
33
def isBefore(self, d2): """ Returns true if self is before d2 """ if self.year < d2.year: return True if self.month < d2.month and self.year == d2.year: if self.day < d2.day and d2.month == self.month and \ self.year == d2.year: return False
34
class Date: def tomorrow(self):
""" moves the date that calls it ahead 1 day """ DIM = [0,31,28,31,30,31,30,31,31,30,31,30,31] # Leap years not accounted for self.day +=1 if self.day > DIM[self.month]: self.day = 1 self.month += 1 if self.month > 12: self.month = 1 self.year += 1
35
Lab tomorrow Add to Date these methods yesterday(self) tomorrow(self)
addNDays(self, N) subNDays(self, N) isBefore(self, d2) isAfter(self, d2) diff(self, d2) diffDebug(self, d2) dow(self) and use your Date class to analyze our calendar a bit…
36
See you in Lab !
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.