1 / 48

xkcd/

http://xkcd.com/. IS 313 Today. Schedule. Where we've been…. Week 0:. Week 4:. Functions and Data. Loops and language. Week 1:. Week 5:. Week 2:. Week 6:. Classes. Where we're going…. Week 8:. Week 12:. 42. 'a'. Projects and Networks. Dictionaries and Classes. Week 9:. value.

Télécharger la présentation

xkcd/

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. http://xkcd.com/

  2. IS 313 Today Schedule Where we've been… Week 0: Week 4: Functions and Data Loops and language Week 1: Week 5: Week 2: Week 6: Classes Where we're going… Week 8: Week 12: 42 'a' Projects and Networks Dictionaries and Classes Week 9: value key Week 13: Week 10: Week 14: a Dictionary object… You're saying that Python's got class? Objects

  3. Watch out! http://www.youtube.com/watch?v=nBeUGqeYsQg

  4. Objects 42 'a' "Oh yeah!" value key Data reigns a Dictionary object… a String object… Python ~ an object-oriented programming language Classes input Methods Functions Types output

  5. Some languages are ALL OBJECTS! Almost all data in Java are OBJECTS The CLASS of an objects is its type. METHODS are f'ns ~ "part of the data"! Now it's data that's royalty!

  6. If I had a dictionary, I guess I could look up what it was! Lists vs. Dictionaries Lists are not perfect… reference 42 5 You can't choose what to name data. L L[0] L[1] L[0], L[1], … You have to start at 0. L[1985] = 'ox' L[1986] = 'tiger' Some operations can be slow for big lists … if'tiger'in L:

  7. More on dictionaries They don't seem moronic to me! Dictionaries have lots of built-in methods, or functions: >>> d = {1990: 'horse', 1991: ram'} >>> d.keys() [ 1990, 1991 ] >>> d.has_key( 1991 ) True >>> d.has_key( 1969 ) False >>> d.pop( 1988 ) 'dragon' keys returns a list of all keys has_key checks if a key is present pop deletes a key and returns its value

  8. Methods There's madness in this method! d.has_key( 1991 ) are functions that are called by the data itself! Functions has_key( 1991, d ) all data must be passed in as function inputs… Warning: this has_key function is for example purposes only. It does not exist! are called on their own…

  9. Classes and Objects Design-it-yourself data.

  10. Software Engineering creating and composing functions Building atop the work of others… Insight into details, e.g., data storage and retrieval. loops and data handling creating new data structures Invention, not reinvention.

  11. 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.

  12. 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.

  13. Using objects and classes: A particularly appropriate reference … >>> d = dict() an example of the dictionary constructor >>> d['answer'] = 42 >>> dir(d) all of the data members and methods of the dictionary class (and thus the object d !) >>> d.keys() [ 'answer' ] >>> d.values() [ 42 ] two methods (functions) within all objects of class dictionary

  14. The CONSTRUCTOR … Code classdict: """ a dictionary class """ def __init__( self ): """ the CONSTRUCTOR """ # sets all of the data needed # there's no data here! Comments the constructor is named __init__ but is used via the class name It sets all the DATA MEMBERS of a new object defines a new datatype called dict the object is called self

  15. The REPR … Code classdict: """ a dictionary class """ def __repr__( self ): """ a grim method """ s = '{' for key in self.keys(): s += str(key) + ':' s += str( self[key] ) + ', ' s += '}' return s Comments this method is named __repr__ and it provides a string that will be used when printing the object being printed is called self the string to print gets returned

  16. Object-oriented programming Do-it-yourself data structures! Blueprint for an object class: your own TYPE of data object: a variable of your own class type variables of that type data members: data an object contains methods: functions an object contains benefits: encapsulation & abstraction An object is alive, responsible, and intelligent. - C++ FAQs

  17. Examples… Python's class libraries… Graphics libraries Do reference libraries have library references? http://docs.python.org/lib/ >>> f = urllib.urlopen( 'http://www.cs.hmc.edu/~dodds/IS313/HW/index.html' ) >>> text = f.read() >>> text[:50]

  18. 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 User-defined structures that become part of the language (at least locally…)

  19. But Why ? • Flexibility create-your-own • Reusability write once, take anywhere • Abstraction worry once, use anywhere ordinary data structures

  20. Date This is a class. It is a user-defined datatype (that you'll build in Lab this week!) We want (or need) to represent lots of interacting calendar days The Problem The Design What data should be set in the constructor? Are you asking what Date-a a Date needs? What functionality will we need to support? d.dow() usually some, but not all, is known beforehand

  21. Using Dates >>> d = Date(1,1,2012) >>> d 1/1/2012 this is a CONSTRUCTOR … What does it do? 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(11,4,2009) >>> d2 11/4/2009 >>> 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 ??

  22. class Date: def__init__( self, m, d, y ): """ the Date constructor """ self.month = m self.day = d self.year = y def__repr__( self ): """ used for printing Dates """ s = "%02d/%02d/%04d" % (self.month, self.day,self.year) return s defisLeapYear( self ): The Date class Why is everyone so far away?!

  23. is the specificOBJECT THAT CALLED THE METHOD ! self >>> d = Date(1,1,2012) >>> d 1/1/2012 These methods need access to the object that calls them >>> d.isLeapYear() True >>> d2= Date(12,31,2011) >>> d2 12/31/2011 >>> d2.isLeapYear() False These methods need access to the object that calls them Why not use d?

  24. Which leap is correct? defisLeapYear( self ): """ left-side leap """ if self.yr%400 == 0: return True elif self.yr%100 == 0: return False elif self.yr%4 == 0: return True else: return False defisLeapYear( self ): """ right-side leap """ if self.yr%4 == 0: return True elif self.yr%100 == 0: return False elif self.yr%400 == 0: return True else: return False

  25. a Leap of faith…. How about a 4000-year rule? class Date: def __init__( self, mo, dy, yr ): (constructor) def __repr__(self): (for printing) defisLeapYear( self ): """ here it is """ if self.yr%400 == 0: return True if self.yr%100 == 0: return False if self.yr%4 == 0: return True return False

  26. Date objects are mutable but only if we want them to be! >>> d = Date(1,1,2008) >>> d 01/01/2008 always created with the CONSTRUCTOR … >>> d.yesterday() >>> d 12/31/2007 >>> d.tomorrow() >>> d 01/01/2008 the yesterday method returns nothing at all. Is it doing anything? d has changed! Some methods return a value; others (like this one) change the object that call it!

  27. What date is on your id? What id is on your Date? Date ids >>> d = Date(11,4,2009) >>> d 11/4/2009 >>> d2 = Date(11,5,2009) >>> d2 11/5/2009 >>> d ==d2 Will these be true or false? >>> d2.yesterday() >>> d ==d2 >>> d.equals(d2 )

  28. Double Date Excuse me -- ids please! >>> d2 = d >>> d 11/4/2009 >>> d.yesterday() >>> >>> d2 >>> d2 == d >>> d2.equals(d) What happens here?

  29. Using copy But where does copy come from? >>> d2 = d.copy() >>> d 11/3/2009 >>> d2 11/3/2009 >>> d.yesterday() >>> d2 >>> d2 == d What happens here?

  30. class Date: def __init__( self, mo, dy, yr ): def __repr__(self): def isLeapYear(self): defcopy(self): """ returns a DIFFERENT object w/same date! """ defequals(self, d2): """ returns True if they represent the same date; False otherwise """ Where are these TWO inputs coming from?

  31. Try it… class Date: defisBefore(self, d2): """ True if self is before d2 """ if self.yr < d2.yr: return True if self.mo < d2.mo: return True if self.dy < d2.dy: return True return False deftomorrow(self): """ moves the date that calls it ahead 1 day """ DIM = [0,31,28,31,30,31,30,31,31,30,31,30,31] Why is this method WRONG for the dates 11/4/2009 1/1/2010 how might you fix this problem? This tomorrow method should not return anything. It just CHANGES the date object that calls it. DIM might be helpful…

  32. class Date: defisBefore(self, d2): """ True if self is before d2 """ if self.yr < d2.yr: return True if self.mo < d2.mo: return True if self.dy < d2.dy: return True return False What's wrong? Why is this method WRONG for the dates 11/4/2009 1/1/2010

  33. class Date: deftomorrow(self): """ moves the date that calls it ahead 1 day """ DIM = [0,31,28,31,30,31,30,31,31,30,31,30,31]

  34. HW today / tomorrow Add these methods to Date copy(self) equals(self, d2) yesterday(self) tomorrow(self) addNDays(self, N) subNDays(self, N) isBefore(self, d2) isAfter(self, d2) diff(self, d2) dow(self) and use your Date class to analyze our calendar a bit… Prof. Art Benjamin no computer required…

  35. Unusual calendar years…

  36. Application #2… Python has no Connect-four datatype… | | | | | | | | | | | | | | | | | | | | | | | | | | | |X| | | | | |X| |X|O| | | |X|O|O|O|X| |O| --------------- 0 1 2 3 4 5 6 Aargh! … but we can correct that! Can I see a demo?

  37. Designing classes 1) What data? (Data Members) Not limited to 7x6! 2) What are objects' crucial capabilities? (Methods)

  38. int int Connect Four: the objectb str str str str list width Board b data str str str str height str str str str data What is the name of the method that will construct this data?

  39. Connect Four: constructor class Board: """ a datatype representing a C4 board with an arbitrary number of rows and cols """ def__init__( self, width, height ): """ the constructor for objects of type Board """ self.width = width self.height = height self.data = [] # this will be the board for row in range( 6 ): boardRow = [] for col in range( 7 ): boardRow += [' '] # add a space to this row self.data += [boardRow] Bad magic?

  40. int int Connect Four: the objectb str str str str list width Board b data str str str str height str str str str | | | | | | | | | | | | | | | | | | | | | | | | | | | |X| | | | | |X| |X|O| | | |X|O|O|O|X| |O| --------------- 0 1 2 3 4 5 6 What is the name of the method that will print this data?

  41. Connect Four: __repr__ def__repr__(self): """ this method returns a string representation for an object of type Board """ s = '' for row in range( 6 ): s += '|' for col inrange( 7 ): s += self.data[row][col] + '|' s += '\n' return s which row is row 0, row 1, and so on? To remove? To add?

  42. Examples defaddMove(self, col, ox): row = self.height-1 while True: if self.data[row][col] == ' ': self.data[row][col] = ox row -= 1 defallowsMove(self, col): a C4 board col # 'X' or 'O' Step through this addMove method. How does it work? What's wrong? allowsMove should return True if col is a valid move; False otherwise.

  43. C4 Board class: methods __init__( self, width, height ) the “constructor” allowsMove( self, col ) checks if allowed addMove( self, col, ox ) places a checker delMove( self, col ) removes a checker __repr__( self ) outputs a string isFull( self ) checks if any space is left winsFor( self, ox ) checks if a player has won hostGame( self ) play! Which is trickiest… ?

  44. Checking wins… ? b X O Thoughts? corner cases?

  45. Thinking about final projects… Lab … and hw questions

  46. There are several well-made, concise tutorials… want to brush up on anything?

  47. Two good references for looking up syntax… http://www.cis.upenn.edu/~matuszek/General/JavaSyntax/ wikipedia, for sure for checking out just one thing!

  48. "thinking like a computer" or, at least, like Java. Aha! But what is this I see? data Constructors are giving me a HEAP of trouble! constructor(s)

More Related