Class::py

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Python — POO
Concepts Classe, méthodes, héritage, méthodes spéciales

En Python, tous les attributs d'une classe sont publics : il est possible de les modifier depuis l'extérieur sans passer par une méthode dédiée. Cette page couvre la définition d'une classe, les méthodes (d'instance, de classe, statiques), les propriétés, les méthodes spéciales et l'héritage.

dans une classe en python, tous les objets sont publics contrairement à d'autres langages.

il est donc possible de modifier les attributs d'une classe depuis l'extérieure de la classe sans passer par une methode ecrite.

definition de la classe et constructeur

# -*-coding:Latin-1 -*

class Personne:
    """Classe definissant un personne :
    - son nom
    - son prenom
    - son age
    - son lieu de résidence """
    nb_pers = 0
    def __init__(self):
        """constructeur de notre classe. chaque element est instancier par un element par defaut"""
        Personne.nb_pers += 1
        self.nom= "smith"
        self.prenom = "marcel"
        self.age = 33
        self.lieu_residence = "Paris"
# bernard = Personne()
# bernard
# bernard.nom

methodes

# -*-coding:Latin-1 -*

class TableauNoir:
    
    def __init__(self):
        """par defaut variable vide"""
        self.surface = ""
        
    def ecrire(self, message):
        if self.surface != "":
            self.surface += "\n"
        self.surface += message

    def lire(self):
        print(self.surface)
    
    def effacer(self):
        self.surface = ""
from class_tableaunoir import *

tab = TableauNoir()
tab.ecrire("cool")
tab.ecrire(" Et cool")
print(tab.surface)
tab.lire()
tab.effacer()
help(TableauNoir)
dir(tab)

methodes de classe et methodes statiques

self pointe l'objet
cls pointe la classe
# -*-coding:Latin-1 -*

class compteur:
    objets_crees = 0 
    def __init__(self):
        compteur.objets_crees += 1
    
    def combien(cls):
        print("Jusqu'à present, {} objets ont ete crees".format(cls.objets_crees))
    
    combien = classmethod(combien)    

compteur.combien()
a = compteur()
compteur.combien()
class test:
    def __init__(self):
        self.mon_attribut ="ok"
    
    def afficher_attribut(self):
        print("Mon attribut est {0}".format(self.mon_attribut))
        
    
    def afficher():
        print("on affiche la meme chose")
        print("peu importe les donnees de lobjet ou de la classe")
    afficher = staticmethod(afficher)


methodes speciales

  • __dict__
un_test = test()
un_test.__dict__
objet.attribut = valeur
objet.__dict__[nom_attribut] = valeur


les propriétés

par convention les methodes commencant par _ ( _set_nom ) ne doivent pas etre appele hors de la classe.

class personne:
        def __init__(self):
            self.nom = nom
            self.prenom = prenom
            self.age = 33
            self._lieu_residence = "paris"
            
        def _get_lieu_residence(self):
            print("On accede au lieu de residence")
            return self._lieu_residence
        
        def _set_lieu_residence(self, nouvelle_residence):
            print("Attention, il semble que {} déménage à {}".format( \
                            self.prenom, nouvelle_residence))
        
        lieu_residence = property(_get_lieu_residence, _set_lieu_residence)

les methodes speciales

  • destruction
def __del__(self):
    print("c'est la fin ! on me supprime !")
  • representation
def __repr__(self):
    return "personne : nom({}), prenom({}), age({})".format(self.nom, self.prenom, self.age)
# repr(objet)
  • acces aux attributs
class protege:
    def __init__(self):
        self.a = 1
        self.b = 2
        self.c = 3
    def __getattr__(self, nom):
        """si python ne trouve pas l'attribut nommé nom, il appelle cette methode"""
        print("alerte ! il n'y a pas d'attribut {} ici !".format(nom))
# pro = protege()
# pro.a
# pro.e
  • __setattr__
def __setattr__(self, nom_attr, val_attr):
    object.__setattr__(self, nom_attr, val_attr)
    self.enregistrer()
  • __delattr__
  • autres methodes d'utilisation par defaut des exemples precedents
objet = maclasse()
getattr(objet, "nom")
setattr(objet, "nom", val)
delattr(objet, "nom")
hasattr(objet, "nom")
  • fonctionne egalement avec :
__getitem__
__setitem__
__delitem__

class zdict:
    def __init__(self):
        self.dictionnaire = {}
    
    def __getitem__(self, index):
        return self._dictionnaire[index]
    
    def __setitem__(self, index, valeur):
        self.dictionnaire[index] = valeur
  • mot clef

contient

ma_liste = [1, 2, 3, 4, 5]
8 in ma_liste
ma_liste.__contains__(8)

taille

len(objet)
objet.__len__

math

class duree:
    def __init__(self, minut=0, sec=0):
        self.minut = minut
        self.sec = sec
    def __str__(self):
        return"{0:02}:{1:02}".format(self.minut, self.sec)

    def __add__(self, objet_a_ajouter):
        nouvelle_duree = duree()
        nouvelle_duree.minut = self.minut
        nouvelle_duree.sec = self.sec
        nouvelle_duree.sec += objet_a_ajouter
        if nouvelle_duree.sec >= 60:
            nouvelle_duree.minut += nouvelle_duree.sec //60
            nouvelle_duree.sec = nouvelle_duree.sec % 60
        return nouvelle_duree
    
d1 = duree(3, 5)
print(d1)
d1 + 4
d1.__add__(4)

d2 = d1 + 54
print(d2) 

__sub__ : surcharge de l'operateur -
__mul__ : surcharge de l'operateur *
__truediv__ : surcharge de l'operateur /
__floordiv__ : surcharge de l'operateur //
__mod__ : surcharge de l'operateur % (modulo)
__pow__ : surcharge de l'operateur ** (puissance)


  • autres speciaux
d1 + 4 => fonctionne mais
4 + d1 ne fonctionne pas. pour cela il existe de formulation
def __radd__(self, aobjet_a_ajouter):
    return self + objet_a_ajouter

+= ; -=

def __iadd__(self, objet_a_ajouter):
    self.sec += objet_a_ajouter
    if self.sec >= 60
        self.minut += self.sec // 60
        self.sec = self.sec % 60
    return self
  • comparaison
== : def __eq__(self, objet_a_comparer):
!= : def __ne__(self, objet_a_comparer):
 > : def __gt__(self, objet_a_comparer):
>= : def __ge__(self, objet_a_comparer):
 < : def __lt__(self, objet_a_comparer):
<= : def __le__(self, objet_a_comparer):
  • methode utile à pickle
__getstate__ : serialiser
class temp:
    def __init__(self):
        self.attr1 = "valeur"
        self.attr2 = "valeur2"
        self.attr_temp = 5
        
    def __getstate__(self):
        dict_attr = dict(self.__dict__)
        dict_attr["attr_temp"] = 0
        return dict_attr

heritage

heritage simple

class a:
    pass # on laisse la classe vide

class b(a)
    pass

----
def __setattr__(self, nom_attr, valeur_attr):
    print("On modifie l'attr{0} de l'objet".format(nom_attr))
    object.__setattr__(self, nom_attr, valeur_attr)
  • fonction pratique
issubclass(b, a)
isinstance(objet, a)

heritage multiple

class a:
    pass # on laisse la classe vide
class b:
    pass # on laisse la classe vide

class c(a, b)
    pass


help on class AttributeError in module builtins:

class AttributeError(Exception)
    Attribute not found
    method resolution order:
      AttributeError
      Exception
      BaseException
      object

Voir aussi