Programmation orientée objet

Comment créer se propres objets en Python.

Vocabulaire

En python tout ce que l’on manipule est un objet :

  • Nombre, liste, dictionnaire, …

  • Tableau numpy

  • Fonction, module, ….

Un objet possède des attributs. Exemple :

z = 1.1J
z.real
a = np.array([1, 2, 4])
a.shape

Un objet possède des méthodes. Exemple :

a.mean()
a.conjugate()
z.conjugate()

Les méthodes sont des fonctions attachées à l’objet. La méthode conjugate d’un tableau n’est pas la même fonction que la méthode conjugate d’un complexe.

Comment créer un objet

Créer un object vecteur

from math import sqrt

class Vecteur():
    def __init__(self, x, y, z):
        self.x = x
        self.y = y
        self.z = z
        
    def __repr__(self):
        return f'Vecteur({self.x}, {self.y}, {self.z})'
    
    def norme(self):
        return sqrt(self.x**2 + self.y**2 + self.z**2)
    
    def __add__(self, other):
        if isinstance(other, Vecteur):
            return Vecteur(self.x + other.x, self.y+other.y, self.z+other.z)
        return NotImplemented
    
    
v1 = Vecteur(1, 2, 3)
v2 = Vecteur(3, 5, 1)
v1 + v2
Vecteur(4, 7, 4)

Attributs d’objet et de class

Les classes sont des objets comme les autres. Elles ont des attributs. Ce sont tous les objets définis dans la classe. Si un objet ne possède pas l’attribut auquel ou souhaite accéder, c’est l’attribut de la classe qui est renvoyée si celui ci existe.

class Test():
    a = 1
    
t = Test()
print(t.a) # Ici on va chercher l'attribut de Test
t.a = 2 # A est maintenant un attribut de l'objet
print(Test.a) # Test possède toujours sont attribut a
1
1

Les méthodes sont des fonctions qui sont des attributs de la classe. C’est lorsque l’on accède à cette attribut par l’objet, une transformation se passe et Python rajoute automatiquement l’objet comme premier argument.

Instance et héritage

L’héritage est un mécanisme qui permet, lors de la déclaration d’une nouvelle classe, d’y inclure les caractéristiques d’une autre classe.

Un objet est une instance de sa classe. On peut le tester avec la méthode isinstance. Il est aussi une instance de toutes les classes dont hérite sa classe.

import math

class FormeGeometrique:
    pass

class Polygone(FormeGeometrique):
    pass

class Cercle(FormeGeometrique):
    def __init__(self, r):
        self.r = r
        
    def surface(self):
        return math.pi*r**2

class Rectangle(Polygone):
    def __init__(self, largeur, longueur):
        self.largeur = largeur
        self.longueur = longueur
        
    def surface(self):
        return self.largeur * self.longueur
    
objet = Rectangle(2, 3)
print(objet.surface())

isinstance(rect, Polygone)

def volume_prisme(base, hauteur):
    return base.surface()*hauteur
6
True

L’utilsation de classes permet d’écrire des méthodes ayant le même nom, mais différentes pour chaque objet. La fonction volume_prisme fonctionne pour tout type de FormeGeometrique possédant une méthode surface.

Méthodes spéciales

  • __init__

  • __repr__, __str__

Lorsque c’est possible, __repr__ doit représenter au mieux l’objet. Souvent il s’agit d’une chaine de caractère qui en étant évaluée renvoie un objet similaire. La méthode __str__ renvoie __repr__ par défaut. Sinon, elle doit être plus simple.

Opérateur unaire et binaire

  • __neg__

  • __add__, __sub__, __mul__, __truediv__, __mod__, __pow__

  • __radd__, …

  • __eq__ (==), __ne__ (!=), __lt__ (<), __le__ (<=), __gt__, __ge__

  • __or__ (|), __and__ (&), __xor__(^)

Emulateur de contenu

  • a[key] => a.__getitem__(key)

  • a[key] = val => a.__setitem__(key, val)

  • del a[key] => a.__delitem__(key)

  • len(a) => a.__len__()

  • for elm in a => for elm in a.__iter__()