devstory

Classes et objets en Python

  1. Objet orienté en Python
  2. Créer une classe en Python
  3. Constructeur avec des paramètres par défaut
  4. Comparer des objects
  5. Attributs 
  6. Des fonctions d'accès Attributs
  7. Les attributs disponible de la classe
  8. Les variables de la classe
  9. Liste des membres d'une classe ou d'un objet
  10. Supprimer l'objet

1. Objet orienté en Python

Python est un langage de programmation orienté vers la procédure (Procedural-oriented) et c'est aussi un langage de programmation orienté objet (Object Oriented).
L'orientée procédurale (procedural- oriented)
L'expression « orientée procédurale» (Procedural-oriented) s'exprime en utilisant des fonctions dans Python. Vous pouvez définir des fonctions et ces fonctions peuvent être utilisées dans d'autres modules du programme Python.
Programmation Orientée Objet (Object Oriented)
Orientée Objet dans Python s'exprime en utilisant la classe, vous pouvez définir une classe (class), class est un prototype de la création des objets.

2. Créer une classe en Python

La syntaxe pour créer une classe :

** class syntax **
class ClassName:
   'Brief description of the class (Optional)'
   # Code ...
  • Pour définir une classe, utilisez le mot-clé class, suivi du nom de la classe et un signe deux-points ( : ). La première ligne du corps de classe est une chaîne qui décrit brièvement de cette classe (pas obligatoire). vous pouvez accéder à cette chaîne via ClassName.__ doc__
  • Dans le corps de classe, vous pouvez déclarer des attributs, des méthodes et des constructeurs.
Attribut (Attribute) :
L'attribut est un membre de la classe. Par exemple, le rectangle comporte deux attributs dont la largeur (width) et la hauteur (height).
Méthodes (Method) :
  • La méthode de la classe est similaire à une fonction normale, mais elle est une fonction de la classe, pour l'utiliser, vous devez appeler à travers l'objet.
  • Le premier paramètre de la méthode est toujours self (un mot-clé qui fait référence à la classe elle-même).
La méthode constructeur (Constructor):
  • Le constructeur (constructor) est une méthode spéciale de classe, elle est toujours nommé __init__
  • Le premier paramètre du constructeur est toujours self (un mot-clé se réfère à la classe elle-même).
  • Le constructeur est utilisé pour créer un objet.
  • Le constructeur attribue des valeurs du paramètre aux propriétés de l'objet qui sera créé.
  • Vous ne pouvez définir qu'un plus constructeur en classe.
  • Si la classe n'est pas définie par le constructeur, par défaut Python considère qu'il a un constructeur par défaut __init __ (self), avec le corps vide, il hérite le constructeur de la classe parente.
rectangle.py
# Une classe de simulation d'un rectangle.
class Rectangle :
    'This is Rectangle class' 
   
    # Une méthode utilisée pour créer l'objet (Contructor).
    def __init__(self, width, height):
        
        self.width= width
        self.height = height
   
    
    
    def getWidth(self):        
        return self.width
    
    
    def getHeight(self):        
        return self.height

    # Méthode pour calculer la superficie.
    def getArea(self):
        
        return self.width * self.height
Créez l'objet de la classe Rectangle :
testRectangle.py
from rectangle import Rectangle

# Créez deux objets : r1 et r2
r1 = Rectangle(10,5)

r2 = Rectangle(20,11)

print ("r1.width = ", r1.width)
print ("r1.height = ", r1.height)
print ("r1.getWidth() = ", r1.getWidth())
print ("r1.getArea() = ", r1.getArea())

print ("-----------------")

print ("r2.width = ", r2.width)
print ("r2.height = ", r2.height)
print ("r2.getWidth() = ", r2.getWidth())
print ("r2.getArea() = ", r2.getArea())
Qu'est-ce qui se passe lorsque vous créez un objet d'une classe?
Lorsque vous créez un objet de la classe Rectangle, le constructeur de cette classe sera appelée pour créer un objet et les attributs de l'objet seront attribués la valeur du paramètre. Il est similaire à l'illustration ci-dessous :

3. Constructeur avec des paramètres par défaut

Contrairement à d'autres langues, la classe de Python n'a qu'un seul constructeur. Cependant, Python permet au paramètre de prendre une valeur par défaut.
Remarque : Tous les paramètres requis doivent précéder tous les paramètres qui ont des valeurs par défaut.
person.py
class Person :
  
    # Les paramètres d'âge (age) et de gendre (gender) ont une valeur par défaut.
    def __init__ (self, name, age = 1, gender = "Male" ):
        
        self.name = name
        self.age = age 
        self.gender= gender
        
    
    def showInfo(self):
        
        print ("Name: ", self.name)
        print ("Age: ", self.age)
        print ("Gender: ", self.gender)
Par exemple :

testPerson.py
from person import Person

# Créez un objet de Person.
aimee = Person("Aimee", 21, "Female")


aimee.showInfo()

print (" --------------- ")

# age, gender par défaut.
alice = Person( "Alice" )

alice.showInfo()

print (" --------------- ")

# gender par défaut.
tran = Person("Tran", 37)

tran.showInfo()

4. Comparer des objects

Dans Python, lorsque vous créez un objet via Constructor (constructeur), il y aura une véritable entité créée se trouvent sur la mémoire, il y a une adresse précise.

Un opérateur assigné à un objet AA par un objet BB ne crée pas une nouvelle entité sur la mémoire, il s'agit simplement d'indiquer l'adresse de AA à l'adresse de BB.

L'opérateur == utilisé pour comparer deux objets qui indiquent qu'il retourne True si les deux objets se réfèrent à la même adresse en mémoire. Les opérateurs != est utilisé pour comparer les deux adresses de deux objets qui indiquent qu'il renvoie True si les deux objets pointent vers deux adresses différentes.

compareObject.py
from rectangle import Rectangle


r1 = Rectangle(20, 10)

r2 = Rectangle(20 , 10)

r3 = r1

# Comparez l'adresse de  r1 et r2
test1 = r1 == r2 # --> False

# Comparez l'adresse de r1 et r2
test2 = r1 == r3 # --> True


print ("r1 == r2 ? ", test1)

print ("r1 == r3 ? ", test2)


print (" -------------- ")

print ("r1 != r2 ? ", r1 != r2)

print ("r1 != r3 ? ", r1 != r3)

5. Attributs 

Dans Python, il y a deux concepts similaires dont vous devez les distinguer :

  • Attribut
  • Variable de la classe

Pour simplifier cela, analysez l'exemple ci-dessous :
player.py
class Player:
    
    # Variable de la classe
    minAge  = 18
    
    maxAge = 50
    
    
    def __init__(self, name, age):
        
        self.name = name
        self.age = age
Attribut
Des objets créés à partir d'une classe seront situés à différentes adresses sur la mémoire et leurs attributs "même nom" ont également différentes adresses sur la mémoire. Par exemple :
testAttributePlayer.py
from player import Player 


player1 = Player("Tom", 20)

player2 = Player("Jerry", 20)

print ("player1.name = ", player1.name)
print ("player1.age = ", player1.age)


print ("player2.name = ", player2.name)
print ("player2.age = ", player2.age)

print (" ------------ ")

print ("Assign new value to player1.age = 21 ")

# Assignez une nouvelle valeur à l'attribut age de player1.
player1.age = 21 

print ("player1.name = ", player1.name)
print ("player1.age = ", player1.age)

print ("player2.name = ", player2.name)
print ("player2.age = ", player2.age)
Python vous permet de créer un nouvel attribut pour un objet préexistant. Par exemple, l'objet player1 et le nouvel attribut sont nommés comme address.
testNewAttributePlayer.py
from player import Player 


player1 = Player("Tom", 20)

player2 = Player("Jerry", 20)

# Créez un nouvel attribut nommé 'adresse' pour player1.
player1.address = "USA"

print ("player1.name = ", player1.name)
print ("player1.age = ", player1.age)
print ("player1.address = ", player1.address)

print (" ------------------- ")

print ("player2.name = ", player2.name)
print ("player2.age = ", player2.age)

# player2 n'a pas d'attribut "adresse"(l'erreur qui se passe ici).
print ("player2.address = ", player2.address)

6. Des fonctions d'accès Attributs

Normalement, vous pouvez accéder à l'attribut d'un objet via l'opérateur "point" (par exemple, player1.name). Cependant, Python vous permet d'accéder à cela via la fonction (function).
Fonction
Description
getattr(obj, name[, default])
Renvoie la valeur de l'attribut ou renvoie la valeur par défaut si l'objet n'a pas cet attribut.
hasattr(obj,name)
Vérifie si cet objet a un attribut donné par le paramètre 'name' ou non.
setattr(obj,name,value)
Définit la valeur à attribuer. Si l'attribut n'existe pas, il sera créé.
delattr(obj, name)
Supprime l'attribut.
testAttFunctions.py
from player import Player 

player1 = Player("Tom", 20)

# getattr(obj, name[, default])
print ("getattr(player1,'name') = " , getattr(player1,"name") )


print ("setattr(player1,'age', 21): ")

# setattr(obj,name,value) 
setattr(player1,"age", 21)


print ("player1.age = ", player1.age)

# Vérifier si player1 a un attribut (attribut)"adresse"?
hasAddress =  hasattr(player1, "address")

print ("hasattr(player1, 'address') ? ", hasAddress)

# Créer l'attribut 'adress' pour l'objet de 'player1'.
print ("Create attribute 'address' for object 'player1'")
setattr(player1, 'address', "USA")

print ("player1.address = ", player1.address)

# Supprimer l'attribut "address".
delattr(player1, "address")

7. Les attributs disponible de la classe

Des classes Python sont les descendants de la classe objet donc elles héritent les attributs suivants :
Attribut
Description
__dict__
Informations sur cette classe est représentée concise facile à comprendre, comme un dictionnaire.

__doc__
Renvoie une chaîne description de la classe, ou renvoie None si elle n'est pas définie
__class__
Renvoie un objet qui contient des informations de la classe, cet objet possède de nombreuses propriétés utiles, y compris l'attribut _name _.
__module__
Renvoie le nom de la classe 'module', ou renvoie "__main__" si cette classe est définie dans le module est en cours d'exécution.
testBuildInAttributes.py
class Customer :
    'This is Customer class'
   
    def __init__(self, name, phone, address):
       
        self.name = name
        self.phone = phone
        self.address = address


john = Customer("John",1234567, "USA")
 

print ("john.__dict__ = ", john.__dict__)

print ("john.__doc__ = ", john.__doc__)


print ("john.__class__ = ", john.__class__)

print ("john.__class__.__name__ = ", john.__class__.__name__) 

print ("john.__module__ = ", john.__module__)

8. Les variables de la classe

En Python, le concept variable de la classe (Class's Variable) est équivalent au concept de champ statique (Static Field) d'autres langues telles que Java, CSharp. Les variables de la classe peuvent être consultées via le nom de la classe ou via l'objet.

Le conseil ici est que vous devez accéder à "Variable de la classe" via le nom de la classe au lieu de l'objet. Cela vous permet d'éviter toutes les confusions entre "Variable de la classe" et l'attribut.
Chaque variable de la classe possède une adresse sur la mémoire et il est partagé avec tous les objets de classe.


testVariablePlayer.py
from player import Player 

player1 = Player("Tom", 20)


player2 = Player("Jerry", 20)

# Accéder via le nom de la classe.
print ("Player.minAge = ", Player.minAge)

# Accéder via l'object.
print ("player1.minAge = ", player1.minAge) 
print ("player2.minAge = ", player2.minAge)


print (" ------------ ") 


print ("Assign new value to minAge via class name, and print..")

# Assigner une nouvelle valeur à minAge via le nom de la classe.
Player.minAge = 19


print ("Player.minAge = ", Player.minAge) 
print ("player1.minAge = ", player1.minAge) 
print ("player2.minAge = ", player2.minAge)

9. Liste des membres d'une classe ou d'un objet

Python vous fournit la fonction dir, cette fonction montre une liste les méthodes, les propriétés, les variables de classe ou de l'objet.
testDirFunction.py
from player import Player

# Imprimer la liste des attributs, les méthodes et les variables de la classe 'Player'
print ( dir(Player) )


print ("\n\n")

player1 = Player("Tom", 20)

player1.address ="USA"

# Imprimer la liste des attributs, les méthodes et les variables de la classe 'player1'
print ( dir(player1) )
Exécutez l'exemple :
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'maxAge', 'minAge']



['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'address', 'age', 'maxAge', 'minAge', 'name']

10. Supprimer l'objet

  • TODO