Académique Documents
Professionnel Documents
Culture Documents
AZILI POO
class Rectangle:
''' Implémentation de la classe rectangle '''
#constructeur
def __init__(self,L,l):
self.longueur=L
self.largeur=l
#calcul du périmetre
def perimetre(self):
''' méthode permettant le calcul du périmetre du rectangle'''
res=(self.longueur+ self.largeur)*2
return res
#calcul de la surface
def surface(self):
''' méthode permettant le calcul de la surface du rectangle'''
res=self.longueur*self.largeur
return res
#Jeu d'essai
#création d'un objet rectangle (Instance d'objet)
R1=Rectangle(5,2)
print(R1) #Affiche adresse mémoire de l'objet
print("Longueur=",R1.longueur)
print("Largeur=",R1.largeur)
print("Perimetre=",R1.perimetre())
print("Surface=",R1.surface())
Ajouter une propriété / attribut de classe NbreRectangles qui donnent le nombre de rectangles crées
class Rectangle:
nbreRectangles=0 #attribut de classe
''' Implémentation de la classe rectangle '''
#constructeur
def __init__(self,L,l):
self.longueur=L
self.largeur=l
Rectangle.nbreRectangles=Rectangle.nbreRectangles+1
Faites un test
R2=Rectangle(10,3)
print("Nombre de rectangles crées=",Rectangle.nbreRectangles)
self.__longueur=L
en préfixant la propriété 2 underscores: __longueur
Tester :
Test :
La classe complète
class Rectangle:
nbreRectangles=0 #attribut de classe
''' Implémentation de la classe rectangle '''
#constructeur
def __init__(self,L,l):
self.__longueur=L
self.largeur=l
Rectangle.nbreRectangles=Rectangle.nbreRectangles+1
# getters & setters
def getLongueur(self):
return self.__longueur
def setLongueur(self,valeur):
self.__longueur=valeur
#calcul du périmetre
def perimetre(self):
#Jeu d'essai
#création d'un objet rectangle (Instance d'objet)
R1=Rectangle(5,2)
print(R1) #Affiche adresse mémoire de l'objet
print("Longueur=",R1.getLongueur())
print("Largeur=",R1.largeur)
print("Perimetre=",R1.perimetre())
print("Surface=",R1.surface())
R2=Rectangle(10,3)
print("Nombre de rectangles crées=",Rectangle.nbreRectangles)
******************
Ma longueur est : --
Ma largeur est : --
*******************
Jeu d'essai
R1=Rectangle(5,2)
print("Longueur=",R1.longueur)
print("Largeur=",R1.largeur)
print("Perimetre=",R1.perimetre())
print("Surface=",R1.surface())
R1.longueur=55
print("Longueur=",R1.longueur)
class Rectangle:
def __init__(self,Long,Larg):
self.__longueur=Long
self.largeur=Larg
def perimetre(self):
p=(self.__longueur+self.largeur)*2
return p
@property # implémenter le getter de la longueur
def longueur(self):
return self.__longueur
@longueur.setter
def longueur(self,valeur):
self.__longueur=valeur
#essai
R1=Rectangle(5,2)
print(R1.longueur)
R1.longueur=99
print(R1.longueur)
Méthode de classe
1. Elle fonctionne à l'intérieur de la classe où elle a été créé et accessible soit via un objet
d'instance soit directement en utilisant le nom de la classe.
2. Une méthode de classe est décorée par @classmethod
3. Une méthode de classe possède un premier paramètre obligatoire nommé cls
Pratique :
#@classmethod
def nombreRectangles(cls):
print("Nombre de rectangles crée :",Rectangle.NbreRectangles)
#autre façon: déclaration de la méthode de classe
#nombreRectangles= classmethod(nombreRectangles)
Destructeur
•Cette procédure est appelée lorsque vous demander vous-même la destruction del R1 (par exple)
•automatiquement en sortant de la portée de l’objet
•Le destructeur est habituellement utilisé pour effectuer des actions avant la destruction de l’objet
(exple : écriture dans un fichier journal)
Pratique :
#redéfinition destructeur
def __del__(self):
f=open('d:/rectangleSupp.txt','a')
chaine=str(self.__longueur)+";"+date.today().strftime("%d/%m/%Y")
f.write(chaine)
f.close()
•La fonction membre spéciale __repr__ retourne la chaîne de caractère qu’il faut afficher lorsque
l’on tape directement le nom de l’objet (plutôt pour le debug)
La fonction membre spéciale __str__ retourne la chaîne de caractère qu’il faut afficher lorsque
l’on appelle la fonction print sur l’objet
Pratique :
#Redéfinition de __str__
def __str__(self):
chaine='Rectangle de surface :'+ str(self.surface())
return chaine
def __repr__(self):
chaine='Rectangle de surface :'+ str(self.surface())
return chaine
Héritage Simple
Implémentation du diagramme de classe suivant :
Pratique :
@property
def prenom(self):
return self.__prenom
@prenom.setter
def prenom(self, value):
self.__prenom=value
@property
def adresse(self):
return self.__adresse
@adresse.setter
def adresse(self, value):
self.__adresse=value
#redéfinition de __str__
def __str__(self):
#res="je suis la personne nommée :"+self.__nom+" "+self.__prenom
res="personne !!!!!!!!!!!"
return res
#redefinition de del
def __del__(self):
f=open('d:/ObjSupp.txt','a')
f.write(self.nom+";"+date.today().strftime("%d/%m/%Y"))
f.close()
#jeu d'essai
#p=Personne('azili','most')
#print(p)
d=date.today().strftime("%d/%m/%Y")
'''
p=Personne("aa","aa","casa")
s=Stagiaire("hichy","A200",pr="Moha",ad=None,dIns=d)
print('--------------------')
print(p)
print(s)
print('----------------')
print("Nom stagiaire",s.nom)
print("PreNom stagiaire",s.prenom)
print("adresse stagiaire",s.adresse)
print("Num stagiaire",s.numeroInscr)
print("__________")
print(s)
'''
s=Stagiaire("hichy","A200",pr="Moha",ad=None,dIns=d)
del s
print('Fin')
Héritage Multiple
Implémentation :
class Personne:
def __init__(self,nom,prenom,dateN=None):
self.__Nom = nom
self.__Prenom = prenom
self.__DateNaissance = dateN
###getter/setter nom
@property
def Nom(self):
return self.__Nom
@Nom.setter
def nomsetter(self,valeur):
self.__Nom = valeur
####getter/setter prenom
@property
def Prenom(self):
return self.__Prenom
@Prenom.setter
def Prenom(self,prenom):
self.__prenom = prenom
####getter/setter datenaissance
@property
def DateNaissance(self):
return self.__dateNaissance
@DateNaissance.setter
def DateNaissance(self,valeur):
self.__DateNaissance = valeur
###method affiche
def AfficheInfos(self):
print("____________________")
print("***** PRESONNE ****")
print("____________________")
print(f"le nom est : {self.nom}\nle prenom est : {self.prenom}\ndate
de naissance est : {self.DateNaissance}")
class Employe:
def __init__(self,CodeEmploye,dateRecrutement=None,Salair=None):
self.CodeEmploye = CodeEmploye
self.DateRecrutement = dateRecrutement
self.Salaire = Salair
#method affiche
def AfficheInfos(self):
print("____________________")
print("***** EMPLOYE ****")
print("____________________")
print(f"le code de l'employe est : {self.CodeEmploye}\nsont date de
recrutement est : {self.DateRecrutement}\nsont salair est : {self.Salaire}")
class Professeur(Personne,Employe):
def __init__(self, Nom,
sp,CodeEmploye,Pren=None,DateRecrutement=None,Salair=None, dateN=None):
Personne.__init__(self,Nom, Pren, dateN)
Employe.__init__(self,CodeEmploye,DateRecrutement,Salair)
self.Specialite = sp
def AfficheInfos(self):
print("Professeur nommé:"+self.Nom+" son code:",self.CodeEmploye,"\n
Spécialité:",self.Specialite)
______________________________
print("je suis dans professeur")
Personne.AfficherInfos(self)
Employe.AfficherInfos(self)
# jeu essai
p = Professeur("azili","maths","C123")
print(p.Nom)
print(p.CodeEmploye)
p.AfficheInfos()
Travail Pratique :
class Rationnel:
def __init__(self,bast,ma9am):
self.Bast=bast
self.Ma9am=ma9am
if self.Ma9am==0:
raise ValueError("Ma9am doit etre different de zero")
def __str__(self):
value = str(self.Bast)+"/"+str(self.Ma9am)
return value
#surcharge de l'operateur +
def __add__(self,r):
denominateur=self.Ma9am*r.Ma9am
numerateur=self.Bast*r.Ma9am+self.Ma9am*r.Bast
Res=Rationnel(numerateur,denominateur)
return Res
#Redifinir le produit *
def __mul__(self,r):
denominateur=self.Ma9am*r.Ma9am
numerateur=self.Bast*r.Bast
Resultat=Rationnel(numerateur,denominateur)
return Resultat
#Programme de Reduction x=pgdc(numerateur,denominateur)
#jeu d'essai
a=Rationnel(6,5)
b=Rationnel(3,2)
print(a+b)
print(a*b)
print((a+b)*(a+b))
Travail personnel :
Exemple :
Pratique :
class Employe:
def __init__(self,mle,nom,nbrH):
self.Matricule=mle
self.Nom=nom
self.NbreHeures=nbrH
self.__salaire=None
#surcharge de Méthode
def calculSalaire(self,taux=None,comm=None):
if (taux is None) and (comm is None):
self.__salaire= self.NbreHeures*10
elif (taux is not None) and (comm is None):
self.__salaire= self.NbreHeures*taux
elif (taux is not None) and (comm is not None):
self.__salaire= self.NbreHeures*taux+comm
# getters & setter du salaire
def getSalaire(self):
return self.__salaire
def setSalaire(self,valeur):
self.__salaire=valeur
salaire=property(getSalaire,setSalaire)
#Jeu essai
e=Employe('M123','azili',100)
e.calculSalaire()
print(e.salaire)
e.calculSalaire(12)
print(e.salaire)
e.calculSalaire(12,800)
print(e.salaire)
class Employe:
def __init__(self,mle,nom,nbrH):
self.Matricule=mle
self.Nom=nom
self.NbreHeures=nbrH
self.__salaire=None
#surcharge de Méthode
def calculSalaire(self,taux=None,comm=None):
if (taux is None) and (comm is None):
self.__salaire= self.NbreHeures*10
elif (taux is not None) and (comm is None):
self.__salaire= self.NbreHeures*taux
elif (taux is not None) and (comm is not None):
self.__salaire= self.NbreHeures*taux+comm
# getters & setter du salaire
def getSalaire(self):
return self.__salaire
def setSalaire(self,valeur):
self.__salaire=valeur
salaire=property(getSalaire,setSalaire)
#surcharge de __eq__
def __eq__(self, other):
if isinstance(other, Employe):
return (self.Matricule == other.Matricule) and
(self.Nom==other.Nom)
else:
return False
def __gt__(self, other):
# return comparison
if isinstance(other, Employe):
return self.Matricule>other.Matricule
def __repr__(self):
return self.Matricule
#Jeu essai
e1=Employe('M123','azili',100)
'''
e.calculSalaire()
print(e.salaire)
e.calculSalaire(12)
print(e.salaire)
e.calculSalaire(12,800)
print(e.salaire)
'''
e2=Employe('M200','azili',100)
e3=Employe('M123','azil',100)
e4=Employe('M223','azil',100)
e5=Employe('M125','azil',100)
e6=Employe('M123','azil',100)
print(e1<e2)
print(e1==e3)
L=[e1,e2,e3,e4,e5]
print(L)
L.sort()
print(L)
Intérêt :
- L'abstraction est l’un des concepts clés dans les langages de programmation orientée
objet
- Rendre le code compréhensible, structuré et propre
En Python, le module abc fournit les fonctionnalités pour définir et utiliser des classes abstraites.
Exemple Pratique :
Implémentation Pratique
self.__longueur=L
self.__largeur=l
#self.Couleur=''
#Implémentation de Couleur obligatoire
@property
def Couleur(self):
return self.__couleur
@Couleur.setter
def Couleur(self,valeur):
self.__couleur=valeur
#Implémentation de surface est obligatoire, sinon error
def Surface(self):
return self.__longueur* self.__largeur
def __str__(self):
return super().__str__() +" Rectangle"
#Implémentation de la classe Cercle
class Cercle(Forme):
def __init__(self,ray):
self.__rayon=ray
#Implémentation de surface est obligatoire, sinon error
def Surface(self):
return self.__rayon**2
#Implémentation de Couleur obligatoire
@property
def Couleur(self):
return self.__couleur
@Couleur.setter
def Couleur(self,valeur):
self.__couleur=valeur
def __str__(self):
return super().__str__()+" Cercle"
#jeu d'essai
r=Rectangle(7,2)
print(r)
print(r.Surface())
r.Couleur="noire"
print(r.Couleur)
c=Cercle(5)
print(c)
print(c.Surface())
c.Couleur='Jaune'
print(c.Couleur)
TP RECAPITULATIF
Énoncé :
Réalisation Type :
Contrat.L.append(self)
Contrat.chiffreAffaire +=float(self.__montant)
#les getters de toutes les ptés
@property
def numero(self):
return self.__numero
@property
def dateContrat(self):
return self.__dateContrat
@property
def montant(self):
return self.__montant
@property
def paye(self):
return self.__paye
#setter de la date contrat
@dateContrat.setter
def dateContrat(self,valeur):
self.__dateContrat=valeur
#redéfinition de __str__
def __str__(self):
chaine='*-------------------------* \n'+\
'* Contrat N°: '+str(self.__numero)+'\n' +\
'* Date Contrat :'+ str(self.__dateContrat) +'\n'+\
'* Montant : '+str(self.__montant)+'\n'+\
'*-----------------------------*'
return chaine
def __repr__(self):
chaine="("+str(self.__numero)+","+str(self.montant)+")"
return chaine
#redéfinir __gt__
def __gt__(self,autre):
if isinstance(autre,Contrat):
return float(self.__montant)>float(autre.__montant)
def __eq__(self,autre):
if isinstance(autre,Contrat):
return float(self.__montant)==float(autre.__montant)
#Méthode Négocier
def Negocier(self,dateNegoce, newMontant, avis):
if str(avis).upper()=='OK':
self.__montant=newMontant
self.__dateContrat=dateNegoce
def reglement ( self,effectue):
if effectue in (True,False):
self.__paye=effectue
#Méthode de classe
@classmethod
def CaRealise(cls):
s=0
#jeu d'essai1
while(True):
os.system("cls")
Menu()
choix=int(input())
if choix==1:
#nouveau contrat
Numero=input('Numero du Contrat :')
Mt=input('Montant :')
c=Contrat(Numero,Mt)
elif choix==2:
print(Contrat.L)
input('Tappez Entrer pour Continuer')
elif choix==3:
x=sorted(Contrat.L,reverse=True)
print(x)
input('Tappez Entrer pour Continuer')
elif choix==4:
print(Contrat.ContratNonRegles())
input('Tappez Entrer pour Continuer')
elif choix==5:
N=input('N° Contrat Négocier ?')
cRech=Contrat.rechercher(N)
if cRech is not None:
D=input('Date de contrat:')
M=float(input('Montant du contrat:'))
A=input('Votre Avis:')
cRech.Negocier(D,M,A)
else:
print('Contrat introuvable')
input('Tappez Entrer pour Continuer')
elif choix==6:
N=input('N° Contrat à régler ?')
cRech=Contrat.rechercher(N)
if cRech is not None:
cRech.reglement(True)
else:
print('Contrat introuvable')
input('Tappez Entrer pour Continuer')
elif choix==7:
Contrat.enregistrer('contrats.txt')
input('Enregistrement terminé! Tappez Entrer pour Continuer')
elif choix==8:
break
L’interface est la vue externe d’un objet, elle définit les services accessibles (attributs et méthodes)
aux utilisateurs de l’objet
Intérêt
Tirer profit du polymorphisme avec des instances dont les classes ne font pas partie de la même
hiérarchie d’héritage
À retenir :
Toutes les méthodes d’une interface sont abstraites.
Les interfaces ne sont pas instanciables
Cas PYTHON :
L'approche de Python en matière de conception d'interface est quelque peu différente par rapport
à des langages tels que Java , Go et C++ . Ces langages ont tous un interface mot-clé,
contrairement à Python. Python s'écarte encore des autres langages sur un autre aspect.
Il n'est pas nécessaire que la classe qui implémente l'interface définisse toutes les méthodes
abstraites de l'interface.
Exemple Pratique :
On souhaite caractériser la fonctionnalité de comparaison qui est commune à tous les objets qui
ont une relation d’ordre ( < , = , >), on peut définir l’interface Comparable.
#jeu d'essai
p1=Personne('aa',60)
p2=Personne('aa',50)
if p1.CompareTo(p2):
print('personnes ave mm age')
else:
print('personnes ave différents ages')
o1=Outil(60)
o2=Outil(60)
if o1.CompareTo(o2):
print('Outils ave mm longueur')
else:
print('Outils ave différents longueurs')
Erreur de syntaxe
Exception
x=int(input('x ='))
y=int(input('y ='))
q=x/y
print('x/y=',q)
try:
x=int(input('nbre:'))
print('x=',x)
print('x/0:',x/0)
except ValueError:
print('il faut tapper un entier')
except ZeroDivisionError:
print('Division par 0 impossible')
bloc finally
try:
x=int(input('nbre:'))
print('x=',x)
print('x/0:',x/0)
except ValueError:
print('il faut tapper un entier')
except ZeroDivisionError:
print('Division par 0 impossible')
try:
x=int(input('Tappez entier :'))
y=1/x
print('x=',x)
except Exception as ex:
print(ex)
Exemple Pratique :
class Stagiaire :
def __init__(self,n,mat,moy):
#Controler le nom chaine de caracteres
assert isinstance(n,str),"Error Type Du Nom"
#Controler la moyenne
self.Nom = n
self.Moyenne = moy
self.Matricule = mat
def __str__(self) :
res = "Nom : " + str(self.Nom) + "\nMatricule : " +
str(self.Matricule) + "\nMoyenne : " + str(self.Moyenne)
return res
#Jeu d'essai
try :
S = Stagiaire(54, "M100",25)
print(S)
except AssertionError as e :
print(e)
Collections – namedtuple
Les namedtuple attribuent une signification à chaque position dans un tuple et permettent un
code plus lisible et auto-documenté.
Nous les utiliserons pour créer des tuples avec des champs nommés
Ils peuvent être utilisés partout où des tuples réguliers sont utilisés, et ils ajoutent la possibilité
d'accéder aux champs par nom au lieu de l'index de position.
collections. namedtuple ( typename , field_names , * , rename =
False , defaults = None , module = None )
Les noms_champs sont une séquence de chaînes telles que :
Alternativement, field_names peut être une seule chaîne avec chaque nom de champ séparé
par des espaces et/ou des virgules, par exemple 'x y' or 'x, y'.
Les tuples sont utilisés pour représenter des données en colonnes. Exemple :
('A123','azili','Mostafa')
Ce tuple n’indique pas clairement ce que représente chacun de ses champs. En réalité,
l’élément 0 est un matricule, l’élément 1 est un nom, et l’élément 2 est le prénom d'une personne.
Donc on utilisera namedtuple du module collections pour générer une classe qui nomme
clairement chaque élément du tuple de personne :
Exemple Pratique :
Collections - deque
La classe deque du module collections est un objet de type liste qui permet d'insérer des éléments au
début ou a la fin d'une séquence avec une performance a temps constant (O(1)) même si cette liste a
des milliers ou des millions d'éléments.
Exemple Pratique :
Travail Personnel :
Collections – counter
Sous classe de dict qui permet de compter des objets hachables.
En fait c’est un dictionnaire avec comme clef les éléments et comme valeurs leur nombre.
class collections.Counter([iterable-or-mapping]) ceci retourne un Counter. L’argument permet de
spécifier ce que l’on veut mettre dedans et qui doit être compte.
Exemple Pratique :
from collections import Counter #Retourne un dico
c=Counter() #compteur vide
print('conteur vide :',c)
c=Counter('omo matio')
print(c)
monCompteur=Counter([1,'a','b',1,5,1,5,5,'a'])
print('Le compteur:',monCompteur)
print('le nombre de a:',monCompteur['a'])
print('le nombre de 5:',monCompteur[5])
# Parcours des clefs du dico retourné par le Counter et affichage
personnalisé
for k in monCompteur.keys():
print(k,'----',monCompteur[k])
#les items renvoyés par le Counter()
for elt in monCompteur.items():
print(elt)
#addition de Counters
print('---- addition de counters ----')
c1=Counter({'A':2,'B':5})
c2=Counter({'A':2,'C':5,'D':9})
c3=c1+c2
print(c3)
Travail personnel :
Vérifier la différence, l’Intersection et l’Union de 2 Counter
Collections - ChainMap
Python contient un conteneur appelé « ChainMap » qui encapsule de nombreux dictionnaires dans
une seule unité. ChainMap est membre du module « collections ».
Exemples Pratiques :
from collections import ChainMap
# programme démostration de ChainMap
# ChainMap retourne une nouvelle ChainMap.
d1 = {'a': 1, 'b': 2}
d2 = {'b': 3, 'd': 4}
d3 = {'e': 5, 'f': 6}
# Defining the chainmap
z = ChainMap(d1, d2, d3)
print('type de c:',type(z))
print(z)
for k, v in z.items(): #parcourir les éléments de z
print(k, v)
print('------------')
# printing values using values()
print ("All values of ChainMap are : ")
print (list(z.values()))
print('------------')
# ajoute un nouveau dictionnaire au début de la ChainMap.
dicNew = { 'xx' : 5 }
z=z.new_child(dicNew)
# printing chainMap using map
print ("Displaying new ChainMap z: ")
print (z.maps)
print('------------')
# inverser l'ordre relatif des dictionnaires dans le ChainMap.
z.maps=reversed(z.maps)
print (list(z.maps))
- Syntaxe :
Les données JSON est écrit sous forme de paires nom / valeur.
Une paire nom / valeur est constituée d'un nom de champ (entre
guillemets), suivi de deux points, suivi d'une valeur :
Exemples :
"nom":"Houssam"
"age": 22
Exemples :
{"nom":"Houssam"}
– Type de valeurs :
En JSON, les valeurs doivent être l’un des types de données suivants :
• String
• Number
• Objet (objet JSON)
• Array
• Boolean
• Null
String { "nom":"Houssam" }
Number { "age":22 }
Object { "employee":{
"nom":"Houssam",
"age":30,
"ville":"Media"
}
}
Array { "employees":[ "Houssam", "Mostafa", "Mehdi" ] }
Boolean { "vendu":false }
Null { "alias":null }
le fichier exemple.Json :
[
{
"prenom": "Mostafa",
"nom": "AZILI",
"fils": [
{
"nomFils": "Othmane",
"age": "16"
},
{
"nomFils": "Youssef",
"age": "13"
}
]
},
{
"prenom": "ALI",
"nom": "MESSI",
"fils": [
{
"nomFils": "ahmed",
"age": "1"
}
]
}
Travail Pratique :
Créer la classe stagiaire (nom ,age)
Écrire une fonction LireJson(chemin) : qui permet de lire un fichier représentant des stagiaires sous
format Json et afficher la liste de leurs noms
Écrire une fonction EcrireJson(chemin,dictionnary) qui écrit une liste de stagiaires dans un fichier
Json.
Solution Proposée :
import json
class Stagiaire:
def __init__(self,n,a):
self.nom=n
self.age=a
def LireJson(chemin):
''' lit un fichier Json et le place ds un dict qu'elle retourne'''
#overture du fichier
f=open(chemin,'r')
#lecture du fichier Json et son chargement ds un dict
dictStagiaire=json.loads(f.read())
f.close()
return dictStagiaire
def EcrireJson(chemin,dictionnary):
#overture du fichier
f=open(chemin,'a')
#Ecriture dans fichier Json
f.write(json.dumps(dictionnary))
f.close()
#prgm ppl ****
'''
d=LireJson('Stagiaires.json')
print(d)
#affichage de la liste des noms de stagiaires
print('---- Liste des stagiaires -----')
for elt in d:
print('\t',elt["nom"])
'''
objS1=Stagiaire('Reda',20)
objS2=Stagiaire('Med',30)
objS3=Stagiaire('Said',16)
d=[{"nom":objS1.nom,"age":objS1.age},
{"nom":objS2.nom,"age":objS2.age},
{"nom":objS3.nom,"age":objS3.age}]
EcrireJson('gpeDev103.json',d)
print('Enregistrement effectué !!')
Les Règles :
formatCode=r'^[0-9]{4}$'
x='1247'
if re.match(formatCode,x):
print('format correct')
else:
print('format incorrect')
formatCode=r'^[a-zA-Z]{1,2}[0-9]{3}$'
x='1aX23'
if re.match(formatCode,x):
print('format correct')
else:
print('format incorrect')
if re.match(formatCode,x):
print('format correct')
else:
print('format incorrect')
#xx=tuple(re.findall(r'\d{4}$|\d{3}','0123456789'))
#print(xx)
#xx=re.search(r'(ab)','01ab3456ab9')
#print(xx)
#format d'une adresse mail : chaine qui commence par une lettre
# @chaine qui commence par une lettre.2 à 4 char. exple: xx_x11x@xaa1.ma
emailPattern= r'^[a-zA-Z]\w*@[a-zA-Z]\w*\.[a-zA-Z]{2,4}$'
x='a_azili@mail.ma'
if re.match(emailPattern,x):
print('format correct')
else:
print('format incorrect')
if re.match(facturePattern,x):
print('format correct')
else:
print('format incorrect')
def indiceDe(self,objStagiaire):
if isinstance(objStagiaire,Stagiaire):
indice=-1
for i in range(len(self.membres)):
if objStagiaire==self.membres[i]:
indice=i
break
return indice
def ajouter(self,membre):
if isinstance(membre,Stagiaire):
res=False
if membre not in self.membres:
self.membres.append(membre)
self.NombreMembres+=1
res=True
return res
# attention!!! Implémentation de la surcharge de méthodes en python
#Polymorphisme
def supprimer(self, numI=None,membre=None):
if numI!=None and membre is None:
trouve=False
for m in self.membres:
if m.numeroIns==numI:
self.membres.remove(m)
self.NombreMembres-=1
trouve=True
print('Suppression effectuée')
break
if trouve==False:
raise TypeError('Element_Introuvable')
elif numI is None and membre!=None:
if isinstance(membre,Stagiaire):
if membre in self.membres:
self.membres.remove(membre)
self.NombreMembres-=1
print('Suppression effectuée')
else:
raise TypeError('Element_Introuvable')
else:
raise TypeError('un paramètre requis')
# redéfinition du __str__ pour le print(club)
def __str__(self):
chaine="CLub de Lecture \n" +\
"Membres ("+str(self.NombreMembres)+") \n"
chaineStagiaires=''
for elt in self.membres:
chaineStagiaires=chaineStagiaires+elt.__str__()
return chaine+"\n"+chaineStagiaires
def enregistrer(self, chemin):
f=open(chemin,'w')
leWriter=csv.writer(f,delimiter=";")
for elt in self.membres:
leWriter.writerow([elt.__str__()])
f.close()
#jeu essai
#créer 3 stagiaires
s1=Stagiaire(111111111111,'hichy')
s2=Stagiaire(111111111119,'anis')
s3=Stagiaire(111111111111,'said')
#affichage d'un stagiaire
print(s1)
if c.ajouter(s2):
print('ajout effectué')
else:
print('Stagiaire existe déja')
if c.ajouter(s3):
print('ajout effectué')
else:
print('Stagiaire existe déja')
# afficher la liste des membres du club
print(c.membres)
c.enregistrer('d:/club.txt')
c.supprimer(membre=c.membres[0])
print(c.membres)