Source image : https://blog.lakinduakash.com/index.php/learn-object-oriented-programming-oop-in-python-3-within-10-minutes/91/
"}],[{"text":"La programmation orientée objet (POO) permet de créer des entités (objets) que l'on peut manipuler . La programmation orientée objet impose des structures solides et claires. Les objets peuvent interagir entre eux, cela facilite grandement la compréhension du code et sa maintenance. On oppose souvent la programmation objet à la programmation procédurale , la première étant plus \"professionnelle\" que l'autre car plus fiable et plus propre.
Une classe regroupe des fonctions (def) et des attributs qui définissent un objet. On appelle par ailleurs les fonctions d'une classe des \" méthodes \".
Créons une classe Voiture :
# coding: utf-8
class Voiture:
def __init__(self):
self.nom = \"Ferrari\"
Notre classe Voiture est une sorte d'usine à créer des voitures.
La méthode __init__() est appelée lors de la création d'un objet.
self.nom est une manière de stocker une information dans la classe. On parle d'attribut de classe. Dans notre cas, on stock le nom dans l'attribut nom .
Ecrire le programme et le tester avec l'instruction suivante :
print(type(Voiture()))
print(Voiture())
Créer et tester la class Dog :
class Dog:
# Class Attribute
species = 'mammal'
# Initializer / Instance Attributes
def __init__(self, name, age):
self.name = name
self.age = age
Tester avec les instructions suivantes :
a = Dog()
print(type(a))
Justifier le résultat.
Un objet est une instance d'une classe . On peut créer autant d'objets que l'on désire avec une classe .
Créons maintenant notre voiture:
ma_voiture = Voiture()
Les attributs de classe permettent de stocker des informations au niveau de la classe. Elle sont similaires aux variables.
Dans notre exemple:
ma_voiture = Voiture()
print(ma_voiture)
print(ma_voiture.nom)
Ecrire et exécuter le code ci-dessous.
Vous pouvez à tout moment créer un attribut pour votre objet:
ma_voiture.modele = \"250\"
Et le lire ainsi:
print(\"modèle\",ma_voiture.modele)
Ecrire et exécuter le code ci-dessous.
Ecrire les résultats ici.
"}],[{"text":"Créer 2 objet Dog ou 2 instances de la classe Dog :
# Instantiate the Dog object
philo = Dog(\"Philo\", 5)
mikey = Dog(\"Mikey\", 6)
Ecrire et tester le code ci-dessous avec les instructions suivantes :
# Access the instance attributes
print(\"{} is {} and {} is {}.\".format(
philo.name, philo.age, mikey.name, mikey.age))
# Is Philo a mammal?
if philo.species == \"mammal\":
print(\"{0} is a {1}!\".format(philo.name, philo.species))
Ecrire les résultats ici.
"}],[{"text":"Les méthodes sont des fonctions définies dans une classe.
Modifions la classe Voiture en y ajoutant une nouvelle méthode :
class Voiture:
def __init__(self):
self.nom = \"Ferrari\"
def donne_moi_le_modele(self):
return \"250\"
Utilisons cette méthode:
ma_voiture=Voiture()
print(\"modèle\",ma_voiture.donne_moi_le_modele())
Ecrire les résultats ici.
Quelque soit le langage, pour la programmation orientée objet il est de préférable de passer par des propriétés pour changer les valeurs des attributs. Alors bien que cela ne soit pas obligatoire, il existe une convention de passer par des getter (ou accesseur en francais) et des setter ( mutateurs ) pour changer la valeur d'un attribut. Cela permet de garder une cohérence pour le programmeur, si je change un attribut souvent cela peut également impacter d'autres attributs et les mutateurs permettent de faire cette modification une fois pour toute.
Un exemple d'utilisation de propriétés:
# coding: utf-8
class Voiture(object):
def __init__(self):
self._roues=4
def _get_roues(self):
print \"Récupération du nombre de roues\"
return self._roues
def _set_roues(self, v):
print \"Changement du nombre de roues\"
self._roues = v
roues=property(_get_roues, _set_roues)
Quand on changera la valeur du nombre de roues, un message apparaîtra. En soi cela n'apporte rien mais au lieu de faire un simple print , vous pouvez par exemple envoyer un mail, etc.
Utiliser la classe avec:
ma_voiture=Voiture()
Changement du nombre de roues
ma_voiture.roues=5
Récupération du nombre de roues
print(\"nb roues\",ma_voiture.roues)
Ecrire et exécuter le code ci-dessous.
Il existe une autre syntaxe en passant par des décorateurs:
class Voiture(object):
def __init__(self):
self._roues=4
@property
def roues(self):
print \"Récupération du nombre de roues\"
return self._roues
@roues.setter
def roues(self, v):
print \"Changement du nombre de roues\"
self._roues = v
Le résultat sera le même, mais la lecture du code se trouve amélioré.
","title":"Les propriétés"},{"edit":" Ecrire ici vos résultats.
Il existe une autre syntaxe en passant par des décorateurs:
# coding: utf-8
class Voiture(object):
def __init__(self):
self._roues=4
@property
def roues(self):
print(\"Récupération du nombre de roues\")
return self._roues
@roues.setter
def roues(self, v):
print(\"Changement du nombre de roues\")
self._roues = v
Tester la classe ci-dessous avec les instructions suivantes et conclure.
ma_voiture=Voiture()
ma_voiture.roues=5
print(\"nb roues\",ma_voiture.roues)
Ecrire ici vos résultats.
Parfois il est intéressant de decortiquer un objet pour résoudre à un bug ou pour comprendre un script.
La fonction dir vous donne un aperçu des méthodes de l'objet:
print(dir(ma_voiture))
Ecrire et tester l'instruction dir.
","title":"La fonction dir"},{"edit":" Ecrire ici le résultat.
Cet attribut spécial vous donne les valeurs des attributs de l'instance:
ma_voiture.__dict__
Tester avec le code suivant ;
# coding: utf-8
class Voiture:
def __init__(self):
self.nom = \"Ferrari\"
def donne_moi_le_modele(self):
return \"250\"
ma_voiture=Voiture()
print(ma_voiture.__dir__)
Ecrire ici le résultat.
L'héritage est un concept très utile. Cela permet de créer de nouvelles classes mais avec une base existante.
Gardons l'exemple de la voiture et créons une classe VoitureSport :
class Voiture:
roues = 4
moteur = 1
def __init__(self):
self.nom = \"A déterminer\"
class VoitureSport(Voiture):
def __init__(self):
self.nom = \"Ferrari\"
On a indiqué que VoitureSport a hérité de classe Voiture , elle recupère donc toutes ses méthodes et ses attributs.
On peut toujours instancier la classe Voiture si on le désire:
ma_voiture=Voiture()
print(\"nom\",ma_voiture.nom)
print(\"nb roues\",ma_voiture.roues)
Instancions maintenant la classe VoitureSport :
ma_voiture_sport=VoitureSport()
print(\"sport\",ma_voiture_sport.nom)
print(\"nb roues\",ma_voiture_sport.roues)
Ecrire et tester les codes ci-dessous et conclure.
On remarque tout d'abord que l'attribut roues a bien été hérité. Ensuite on remarque que la méthode __init__ a écrasé la méthode de la classe Voiture . On parle alors de surcharge de méthode.
Comme nous l'avons vu précédemment une classe hérite d'une autre classe, elle hérite les méthodes de son parent .
Exemple:
# coding: utf-8
class Voiture:
roues = 4
moteur = 1
def __init__(self):
self.nom = \"A déterminer\"
def allumer(self):
print(\"La voiture démarre\")
class VoitureSport(Voiture):
def __init__(self):
self.nom = \"Ferrari\"
ma_voiture_sport = VoitureSport()
ma_voiture_sport.allumer()
Ecrire et tester le code ci-dessous.
Il est cependant possible d' écraser la méthode de la classe parente en la redéfinissant. On parle alors de surcharger une méthode .
# coding: utf-8
class Voiture:
roues = 4
moteur = 1
def __init__(self):
self.nom = \"A déterminer\"
def allumer(self):
print(\"La voiture démarre\")
class VoitureSport(Voiture):
def __init__(self):
self.nom = \"Ferrari\"
def allumer(self):
print(\"La voiture de sport démarre\")
ma_voiture_sport = VoitureSport()
ma_voiture_sport.allumer()
Tester le code et conclure.
Enfin dernier point intéressant: il est possible d'appeler la méthode du parent puis de faire la spécificité de la méthode. On peut d'ailleurs appeler n'importe quelle autre méthode.
# coding: utf-8
class Voiture:
roues = 4
moteur = 1
def __init__(self):
self.nom = \"A déterminer\"
def allumer(self):
print(\"La voiture démarre\")
class VoitureSport(Voiture):
def __init__(self):
self.nom = \"Ferrari\"
def allumer(self):
Voiture.allumer(self)
print(\"La voiture de sport démarre\")
ma_voiture_sport = VoitureSport()
ma_voiture_sport.allumer()
Tester le code et conclure.
Les classes Voiture et VoitureSport possédent donc chacune une méthode de même nom mais ces méthodes n'effectuent pas les mêmes tâches. On parle dans ce cas de polymorphisme
"},{"edit":"Ecrire ici les résultats.
"}],[{"text":"Tester le code et conclure :# Parent class
class Dog:
# Class attribute
species = 'mammal'
# Initializer / Instance attributes
def __init__(self, name, age):
self.name = name
self.age = age
# instance method
def description(self):
return \"{} is {} years old\".format(self.name, self.age)
# instance method
def speak(self, sound):
return \"{} says {}\".format(self.name, sound)
# Child class (inherits from Dog class)
class RussellTerrier(Dog):
def run(self, speed):
return \"{} runs {}\".format(self.name, speed)
# Child class (inherits from Dog class)
class Bulldog(Dog):
def run(self, speed):
return \"{} runs {}\".format(self.name, speed)
# Child classes inherit attributes and
# behaviors from the parent class
jim = Bulldog(\"Jim\", 12)
print(jim.description())
# Child classes have specific attributes
# and behaviors as well
print(jim.run(\"slowly\"))
Ecrire ici les résultats.
Tester le code et conclure :
# Parent class
class Dog:
# Class attribute
species = 'mammal'
# Initializer / Instance attributes
def __init__(self, name, age):
self.name = name
self.age = age
# instance method
def description(self):
return \"{} is {} years old\".format(self.name, self.age)
# instance method
def speak(self, sound):
return \"{} says {}\".format(self.name, sound)
# Child class (inherits from Dog() class)
class RussellTerrier(Dog):
def run(self, speed):
return \"{} runs {}\".format(self.name, speed)
# Child class (inherits from Dog() class)
class Bulldog(Dog):
def run(self, speed):
return \"{} runs {}\".format(self.name, speed)
# Child classes inherit attributes and
# behaviors from the parent class
jim = Bulldog(\"Jim\", 12)
print(jim.description())
# Child classes have specific attributes
# and behaviors as well
print(jim.run(\"slowly\"))
# Is jim an instance of Dog()?
print(isinstance(jim, Dog))
# Is julie an instance of Dog()?
julie = Dog(\"Julie\", 100)
print(isinstance(julie, Dog))
# Is johnny walker an instance of Bulldog()
johnnywalker = RussellTerrier(\"Johnny Walker\", 4)
print(isinstance(johnnywalker, Bulldog))
# Is julie and instance of jim?
print(isinstance(julie, jim))
Ecrire ici les résultats.
Prenez l'habitude de nommer votre classe uniquement avec des caractères alphanumériques et commençant par une majuscule. Et à l'inverse l'instance peut être nommée sans majuscule.
voiture_sport = VoitureSport()
","title":"Conventions"},{"edit":" "}],[{"text":"Faites suivant et envoyez votre travail au format pdf à l'adresse mail ci-dessous :
Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.