Class::py
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