% Programmation avec Python (chapitre 6) % Dimitri Merejkowsky
\center \huge Les classes
Une façon d’envisager le code. Pour l’instant on n’a vu que le paradigme procédural (ou (impératif).
Il y en a plein d’autres! (fonctionnel notamment, dont on parlera un jour)
Aujourd’hui on va parler de l’orienté objet.
Un nouveau built-in: id()
L’adresse de l’objet pointé par la variable:
>>> a = 42532
>>> id(a)
94295009035968
>>> b = a
>>> id(b) # même objet
94295009035968
>>> c = 42532 # objet différent, même valeur
>>> id(c)
Mettre au même endroit:
L’important c’est que les deux aillent ensemble
OOP en Anglais (ou juste OO)
Des “cellules” qui s’envoient des “messages”.
Notamment, les cellules ne “voient” que leur état interne.
On peut envoyer un message d’une cellule à une autre sans connaître beaucoup de détails à propos du destinataire du message
On va parler d’une façon de faire de l’orienté objet: avec des classes.
Mais notez bien qu’on peut faire de l’orienté objet sans classes!
La seule chose dont on a besoin, c’est le mot-clé class
et un nom.
class MyObject:
pas
La classe est le plan de construction de notre objet.
>>> object_1 = MyObject()
>>> object_2 = MyObject()
Python ne sait rien de l’objet à part son adresse on mémoire et son nom:
print(object_1)
<__main__.MyObject at 0x7f52c831e2b0>
On appelle object_1
et object_2
des instances de la classe MyObject
.
Une fonction dans une classe
class MyObject:
def my_method(the_object):
print("hello", the_object)
C’est tout!
La méthode n’existe pas en dehors de la classe (souvenez vous des cellules !)
>>> my_method()
NameError
>>> object = MyObject()
>>> object.my_method()
Hello, <MyObject at 0x7f52c9f6d6d8>
Notez que my_method
a pris en premier argument ce qu’il y avait à gauche du point:
D’ailleurs, ce code fonctionne aussi et retourne la même chose:
>>> MyObject.my_method(object)
Hello, <MyObject at 0x7f52c9f6d6d8>
Il faut passer l’objet en cours en paramètre:
class MyObject:
def broken():
print("You cannot call me!")
>>> o = MyObject()
>>> o.broken()
TypeError: broken() takes 0 positional arguments but 1 was given
self
class MyObject:
def my_method(self):
print("hello", self)
>>> object = MyObject()
>>> object.attribute # ici l'attribut n'existe pas
AttributError
>>> object.attribute = 42 # maintenant oui
>>> object.attribute
42
Avec self
, bien sûr:
class MyObject:
def print_attribute(self):
print(self.attribute)
def change_attribute(self, new_value)
self.attribute = new_value
>>> object = MyObject()
>>> object.print_attribute() # ici l'attribut n'existe pas
AttributError
>>> object.attribute = 42
>>> object.print_attribute() # ça marche
42
>>> object.change_attribute(43)
>>> object.attribute
43
Avec __init__
:
class MyObject:
def __init__(self):
self.attribute = 42
>>> object = MyObject()
>>> object.attribute
42
__init__()
et MyObject()
sont des appels de fonctions comme les autres
class Car:
def __init__(self, color_to_use="black"):
self.color = color_to_use
>>> ford = Car()
>>> ford.color
"black"
>>> ferrari = Car(color_to_use="red")
>>> ferrari.color
"red"
En vrai, on nomme souvent les paramètres du constructeur et les attributes de la même façon.
class Car:
def __init__(self, color="black"):
self.color = color
self
en premier argument)