1 Object Oriented Programming Revisited Classes – Ideal for modeling real-world phenomena – Encapsulate data: Attributes – Encapsulate function: Behaviors – Act as blueprints Objects are instantiated from classes
2 An abstract game with two players Player: – Name – Overall skill (5.0 – 10.0) – Motivation flux mf (0.0 – 1.0) – Current strength: Current motivation cm : random number in [ -mf, mf ] Current strength = skill + skill * cm With motivation 1.0, current strength is 2 * skill. With motivation 0.0, current strength is skill. Motivation flux 0.0: very stable player. Motivation flux 1.0: very unstable player.
3 Object reference self first argument in all methods self refers to the object on which the method is called Object attribute self.skill vs. local variable skill player.py
4 >>> from player import Player >>> john = Player('John', 1.0, 8.0) >>> paul = Player('Paul') >>> print paul.skill 7.5 john name = ‘John’ skill = 8.0 motivation_flux = 1.0 name = ‘Paul’ skill = 7.5 motivation_flux = 0.0 paul No self argument in method calls! Python puts object reference in place of self class Player
5 Summary – Class header Keyword class begins definition, followed by name of class and colon ( : ) – Body of class Indented block of code – Optional documentation string Describes the class Appears immediately after class header – Constructor method __init__ Executes each time an object is created Initialize attributes of class Returns None – Object reference All methods must at least specify this one parameter Represents object of class on which a method is called Called self by convention
6 Remember the self. prefix when referencing object attributes >>> from player_wrong import Player >>> ringo = Player("Ringo") >>> print ringo.my_skill Traceback (most recent call last): File " ", line 1, in ? AttributeError: Player instance has no attribute ‘my_skill'
7 Let’s do something with our objects: method play player2.py >>> from player2 import Player >>> john = Player("John", 1.0, 8.0) >>> paul = Player("Paul") >>> john.play(paul) John (11.97) - Paul (7.50): John wins >>> john.play(paul) John (1.88) - Paul (7.50): Paul wins >>> paul.play(john) Paul (7.50) - John (3.32): Paul wins
8 Destructors Constructor named __init__ Destructor – Method is named __del__ – Executed automatically when object is destroyed or when no more references to object exist – Can be used for housekeeping before Python reclaims object memory
9 Class Attributes – One copy of attribute shared by all objects of a class – Represents “class-wide” information Property of the class, not of an object of the class – Initialized once in the class definition (not in constructor) Otherwise it would be re-initialized every time an object is created – Accessed through the class name or any object of the class May exist even if no objects of class exist
10 Adding class attribute count + destructor player3.py >>> from player3 import Player >>> paul = Player('Paul') >>> ringo = Player('Ringo') >>> del paul Player Paul deleted
11 Preparing to hold tournaments player4.py New object attribute wins to keep track of match results New play method which updates attribute wins
12 Testing.. >>> from player4 import Player >>> john = Player('John', 0.2, 8.0) >>> paul = Player('Paul') >>> john.play(paul) John defeats Paul >>> john.play(paul) John defeats Paul >>> john.play(paul) John defeats Paul >>> john.play(paul) Paul defeats John >>> print john.wins 3 >>> print paul.wins 1 >>> ^D Player Paul deleted Player John deleted threonine:~/python% NB: destructor called automatically when session ends
13 Now we’re ready to hold a tournament! player_game.py
14 Holding tournament with four players threonine:~/python% python player_game.py Player name: John John's skill ( ): 8 John's motivation flux ( ): 0.2 Player name: Paul Paul's skill ( ): 7.5 Paul's motivation flux ( ): 0 Player name: George George's skill ( ): 7.5 George's motivation flux ( ): 0.5 Player name: Ringo Ringo's skill ( ): 7.5 Ringo's motivation flux ( ): 1.0 Paul defeats John John defeats George Ringo defeats John George defeats Paul Ringo defeats Paul Ringo defeats George Ringo is the winner with 3 wins! Tournament matches Player initialization