Concepts clés de la POO en Python
Concepts clés de la POO en Python
Master 3I [Link]
Programmation Orientée Objet
Dictionnaire et OO
Descriptors
Protection des attributes
Méthodes POO
Méthodes de classe :Classmethod
Méthodes statiques : Staticmethod
Concepts POO : Héritage, Composition, Polymorphisme
Abstract Base Classes
Inner Class
Metaclass
Iterator & Generator
Exceptions
Class as Decorator
2
Abstract Base Classes
Les classes de base abstraites sont une forme de contrôle d'interface plus
stricte que les contrôles individuels de hasattr () pour des méthodes
particulières.
En définissant une classe de base abstraite, vous pouvez définir une API
commune pour un ensemble de sous-classes.
Version 1:
from abc import ABC
class PluginBase(ABC):
@abstractmethod
def Methode(self, *args):
return
Exécution:
>>> y=PluginBase()
Traceback (most recent call last):
File "<ipython-input-8-a87bf2409844>", line 1, in <module> y=PluginBase()
TypeError: Can't instantiate abstract class PluginBase with abstract methods load, save
Abstract Base Classes:
Registering a Concrete Class
Il existe deux façons d'indiquer qu'une classe concrète implémente une
abstraite : c’est d’enregistrer la classe avec l'abc ou la sous-classe
directement à partir de l'abc.
1-Register subclass as a “virtual subclass” of this ABC.
Exemple :
import abc from abc_base
import PluginBase
class RegisteredImplementation(object):
def load(self, input): return [Link]()
def save(self, output, data): return [Link](data)
[Link](RegisteredImplementation)
if __name__ == '__main__':
print ('Subclass:', issubclass(RegisteredImplementation, PluginBase))
print ('Instance:', isinstance(RegisteredImplementation(), PluginBase))
Exécution:
Subclass: True
Instance: True
Abstract Base Classes:
Implementation Through Subclassing
2-En subclassant directement à partir de la base, nous pouvons
éviter la nécessité d'enregistrer la classe explicitement.(Register)
Exemple :
import abc
from abc_base import PluginBase
class RegisteredImplementation(PluginBase):
def load(self, input): return [Link]()
def save(self, output, data): return [Link](data)
if __name__ == '__main__':
print ('Subclass:', issubclass(RegisteredImplementation, PluginBase))
print ('Instance:', isinstance(RegisteredImplementation(), PluginBase))
Exécution:
Subclass: True
Instance: True
Abstract Base Classes
Les classes de base abstraites sont une forme de contrôle d'interface plus
stricte que les contrôles individuels de hasattr () pour des méthodes
particulières.
Par la définition d’une classe de base abstraite, on peut définir une API
commune pour un ensemble de sous-classes.
Version 1:
from abc import ABC
class PluginBase(ABC):
@abstractmethod
def Methode(self, *args):
return
Exécution:
>>> y=PluginBase()
Traceback (most recent call last):
File "<ipython-input-8-a87bf2409844>", line 1, in <module> y=PluginBase()
TypeError: Can't instantiate abstract class PluginBase with abstract methods load,
save
8
Abstract Base Classes: Registering a Concrete Class
Il existe deux façons d'indiquer qu'une classe concrète implémente une
abstraite : c’est d’enregistrer la classe avec l'abc ou la sous-classe
directement à partir de l'abc.
Register subclass as a “virtual subclass” of this ABC.
Exemple :
import abc from abc_base
import PluginBase
class RegisteredImplementation(object):
def load(self, input): return [Link]()
def save(self, output, data): return [Link](data)
[Link](RegisteredImplementation)
if __name__ == '__main__':
print ('Subclass:', issubclass(RegisteredImplementation, PluginBase))
print ('Instance:', isinstance(RegisteredImplementation(), PluginBase))
Exécution: Subclass: True
Instance: True
9
Abstract Base Classes: Implementation Through Subclassing
Exécution:
Subclass: True
Instance: True
10
Interface vs Abstract class
Python interface Python abstract class
An interface is a set of methods and We can use an abstract base class to
attributes on that object. define and enforce an interface.
11
Inner Classe
Les classes internes (ou "inner classes") sont des classes définies à l'intérieur d'une
autre classe. Elles sont souvent utilisées pour encapsuler une logique spécifique à la
classe parente et pour créer des classes qui n'ont de sens que dans le contexte de
la classe parente.
Exemple:
Une classe (Human) avec une classe interne (Head).
Une instance est créée qui appelle une méthode dans la classe interne:
class Human:
def __init__(self):
[Link] = 'Guido'
[Link] = [Link]()
class Head:
def talk(self):
return 'talking...'
if __name__ == '__main__':
guido = Human() Guido
print ([Link]) talking...
print ([Link]())
Inner Classe
Les classes internes sont souvent utilisées pour les raisons
suivantes :
1. Encapsulation : Les classes internes permettent d'encapsuler une
logique spécifique à la classe parente, ce qui permet de rendre le code
plus clair et plus facile à comprendre.
2. Modèle de classe unique : Les classes internes peuvent être utilisées
pour définir des classes qui n'ont de sens que dans le contexte de la
classe parente.
3. Héritage : Les classes internes peuvent hériter de la classe parente ou
d'une autre classe interne, ce qui leur permet d'étendre ou de
personnaliser le comportement de la classe parente.
4. Organisation : Les classes internes peuvent aider à organiser le code
en groupant les classes et les méthodes qui sont liées entre elles. Cela
peut également faciliter la compréhension et la maintenance du code.
Inner Classe
[Link] :
Inner Classe
2. Modèle de classe unique :
Inner Classe
3. Héritage :
Inner Classe
4. Organisation : ( Multiple inner classes)
Programmation Orientée Objet
Object Concept :
__new__ Method
Metaclass
Abstract Base Classes
Interface Class
Inner Class
18
Création de l’objet : __new__
__new__ est le vrai constructeur.
Pour cette raison, elle doit retourner un objet.
Exemple:
class Premiere(object):
def __new__(cls, prix):
print ("%s euros" % prix)
return super(Premiere, cls).__new__(cls)
>>> c = Premiere(10000)
10000 euros
__new__ est appelée AVANT la création de l’objet, car c’est son boulot de
créer l’instance et de la retourner.
On appelle super() pour utiliser la méthode __new__ de object et créer
une instance pour cette classe.
L’objet créé sera ensuite passé à __init__ automatiquement par Python.
19
Création de l’objet : __new__
La valeur de retour de __new __ () devrait être la
nouvelle instance d'objet (habituellement une instance
de cls).
Les implémentations typiques créent une nouvelle
instance de la classe en invoquant la méthode
__new __ () de la superclasse en utilisant:
super (currentclass, cls) .__ new __ (cls [, ...])
Object.__new__(cls)
avec les arguments appropriés, puis en modifiant
l'instance nouvellement créée comme nécessaire
avant de la retourner.
20
Création de l’objet : __new__
La valeur de retour de __new __ () devrait être la
nouvelle instance d'objet (habituellement une instance
de cls).
Syntax:
class class_name:
def __new__(cls, *args, **kwargs):
statements
. .
return super(class_name, cls).__new__(cls, *args, **kwargs)
21
Création de l’objet : __new__
En résumé: __new__ est le vrai constructeur, il est appelé
pour créer l’objet, et l’objet ainsi instancié est passé
à __init__. class Premiere(object):
Exemple: def __new__(cls, prix):
print ("__new__“)
return super(Premiere, cls).__new__(cls)
def __init__(self, *args):
print ("__init__“)
>>> c = Premiere(10000)
__new__
__init__
22
Métaclasse
Une classe est un objet, et comme tout autre objet, c'est une
instance de quelque chose: une métaclasse.
La métaclasse par défaut est type.
Le type est un peu confus: il peut également être utilisé comme
une fonction qui renvoie la classe d'un objet:
>>> class Foobar: >>> isinstance(foo, Foobar)
... pass True
... >>> isinstance(Foobar, type)
>>> type(Foobar)
True
<class 'type'>
>>> foo = Foobar()
>>> type(foo)
<class '__main__.Foobar'>
23
Metaclass : Type Simple use
L'énoncé de la classe n'est pas seulement du sucre syntaxique, il fait
certaines choses supplémentaires, comme le réglage d'une __qualname__
et __doc__ propriétés adéquates ou l'appel __prepare__.
>>> MyClass = type('MyClass', (), {})
>>> MyClass
<class '__main__.MyClass'>
25
Metaclass: __prepare__ method
La méthode prepare est appelée avant que le corps de classe
soit exécuté et il doit renvoyer un objet de type
dictionnaire qui est utilisé comme espace de noms local pour
tout le code du corps de classe.
La méthode prepare a été ajouté en Python 3.0, (PEP-3115).
Si __prepare__ renvoie un objet x, alors:
class Class(metaclass=Meta):
a=1
b=2
c=3
Foobar .__ new__ est utilisé pour créer des instances de Foobar
Type .__ new__ est utilisé pour créer la classe Foobar (une
instance de type dans l'exemple)
27
Metaclasses : object creation
Diagramme de la façon dont les instances sont
construites:
28
Metaclasses : class creation
Diagramme de la façon dont les classes sont construites:
MetaClass .__ prepare__ renvoie simplement
l'objet namespace (un objet de type dictionnaire).
Une fois la métaclasse appropriée identifiée,
l'espace de noms de classe est préparé.
Si la métaclasse a un attribut __prepare__, elle est
appelée comme
namespace = metaclass .__ prepare __ (nom, bases, **
kwds)
La méthode __prepare__ doit être implémentée
comme méthode de classe ().
L'espace de noms retourné par __prepare__ est
passé à __new__, mais lorsque l'objet de classe final
est créé, l'espace de noms est copié dans un nouveau
dict.
29
Metaclasses : class creation
Diagramme de la façon dont les classes sont construites:
MetaClass .__ prepare__ renvoie
simplement l'objet namespace (un
objet de type dictionnaire ).
Metaclass .__ new__ retourne
l'objet Class.
MetaMetaclass .__ call__ renvoie
tout ce que Metaclass .__ new__
a retourné (et s'il renvoie une
instance de Metaclass, il appellera
également Metaclass .__ init__ sur
celui-ci)
30
Metaclasses : Methods
__prepare__(metacls, name,
bases, **kwargs) dict
Lors de l'initialisation de l'espace
de noms de la classe
__new__(mcs, classname, bas
es, attrs) cls
Avant la création de la classe
__init__(self, name, bases, att
rs) None
Apres la création de la classe
__call__(self, *args, **kwargs)
permet un comportement
personnalisé lorsque la classe
est appelée
31
Metaclasses : Methods
Une fois que la métaclasse appropriée a été identifiée, l'espace de
noms de classe est préparé.
Si la métaclasse a un attribut __prepare__ , elle est
appelée namespace = metaclass.__prepare__(name, bases, **
kwds) (où les arguments de mot clé supplémentaires, le cas
échéant, proviennent de la définition de classe).
La méthode __prepare__ doit être implémentée en tant
que classmethod().
L'espace de noms renvoyé par __prepare__ est transmis
à __new__, mais lorsque l'objet de classe final est créé, l'espace de
noms est copié dans un nouveau dict.
Si la métaclasse n'a pas d'attribut __prepare__ , alors l'espace de
noms de classe est initialisé en tant que mappage ordonné vide .
32
Metaclasses : Heritage Class vs MetaClass
33
Metaclasses : class creation
Exemple :
Class MTC(type):
def __new__(metacls,n,b,dict):
print( "Crétion de la classe {}".format(n))
return type.__new__(metacls,n,b,dict)
Class Maclass(metaclass=MTC):
pass
34
Metaclasses : class creation
The metaclass is called when the system encounters the class definition:
1) The __prepare__ method is called, if there is one, to supply the data structure for
the namespace.
2) The class body is evaluated and stored in the namespace.
3) __new__ is called to create the class instance usually delegating to
super().__new__.
4) __init__ is called to initialize the class.
Exemple :
35
Metaclasses
Exemple :
class Meta(type):
def __new__(cls, name, bases, dct):
x = super().__new__(cls, name, bases, dct)
[Link] = 100
return x
class Bar(metaclass=Meta):
[Link], [Link]
pass
(100, 100)
class Qux(metaclass=Meta):
pass
36
Metaclasses
# our metaclass
Exemple2 : class MultiBases(type):
# overriding __new__ method
def __new__(cls, clsname, bases, clsdict):
# if no of base classes is greator than 1
# raise error
if len(bases)>1:
raise TypeError("Inherited multiple base classes!!!")
class Base(metaclass=MultiBases):
pass
# no error is raised
class A(Base):
pass
Traceback (most recent call last):
# no error is raised File "[Link]", line 29, in <module>
class B(Base): class C(A, B):
pass File "[Link]", line 8, in __new__
raise TypeError("Inherited multiple base classes!!!")
# This will raise an error!
class C(A, B):
TypeError: Inherited multiple base classes!!!
pass
37
MetaClass :
__subclasscheck__&__subclasshook__
__subclasscheck__est l’une des méthodes pour
personnaliser le résultat de la fonction intégrée
issubclass() .
C’est une méthode pour vérifier si une classe est une
sous-classe ou non.
La fonction retourne True si la classe est considérée
comme une sous-classe (directe ou indirecte) d’une autre
classe, sinon, retourne False.
La fonction ne peut pas être définie comme une méthode
de classe dans la classe réelle/réelle. Il est implémenté
dans la métaclasse, car ce n’est pas pour les classes
ordinaires.
38
MetaClass :
__subclasscheck__&__subclasshook__
Exemple:
39
MetaClass :
__subclasscheck__&__subclasshook__
Exemple:
40
MetaClass :
__subclasscheck__&__subclasshook__
La classe abstraite peut remplacer la __subclasshook__()
méthode à personnaliser issubclass().
Il retourne True lorsqu’une classe s’avère être une sous-
classe d’une classe ABC, il retourne False si ce n’est pas le
cas et renvoie NotImplemented si la vérification de sous-
classe se poursuit avec le mécanisme habituel.
La méthode est définie dans la classe ABC avec certaines
conditions.
Les classes qui respectent ces conditions sont considérées
comme une sous-classe.
Remarque: il doit être défini comme une méthode de
classe.
41
MetaClass :
__subclasscheck__&__subclasshook__
42
MetaClass :
__subclasscheck__&__subclasshook__
Aspect __subclasscheck__ __subclasshook__
Disponible dans les versions
Introduction Introduit dans Python 3.10 et supérieurs
antérieures à Python 3.10
Méthode de Oui (doit être décorée avec
Non (méthode normale)
classe @classmethod)
Appel Requiert un appel explicite avec Appelé automatiquement par
explicite issubclass(cls, subclass) issubclass(subclass, cls)
Hiérarchie Méthode peut être définie à différents Un seul __subclasshook__ est considéré, le
de résolution niveaux de la hiérarchie de classe plus proche dans la hiérarchie
@classmethod
Signature def __subclasscheck__(cls, subclass):
def __subclasshook__(cls, subclass):
43
Exceptions: Introduction
Les exceptions fournissent un mécanisme de contrôle de flot de haut
niveau. Une exception peut être déclenchée soit par l'interpréteur
(python) soit par un programme.
Les exceptions sont utilisables dans les cas suivants :
Gestion des erreurs ; python déclenche les exceptions dès qu'il détectent des
erreurs dans l'exécution des programmes.
Deux cas sont envisageables lorsqu'une exception est levée [to raise an exception] :
Elle est interceptée pour être traitée de manière interne par le programme.
Elle est ignorée, ce qui déclenche le comportement par défaut, i.e. l'interruption du programme et
l'affichage d'un message d'erreur explicitant l'endroit où elle s'est produite.
Notification d'évènements ; penser à une fonction de recherche qui lèverait une
exception en cas de succès plutôt que de renvoyer un code standard (du
genre 1 ou True).
Gestion de cas particulier ; ce qui permet de conserver un code sans les
lourdeurs associées à des cas rares.
Contrôle de flot inhabituel ; pour remonter en quelque sorte dans le programme
en cours d'exécution pour défaire par exemple certaines affectations.
Exceptions: try/except/else
La syntaxe est la suivante :
try:
<statementlist>
except[:| <label>[, <data>]:]
<anotherstatementlist>
else:
<anotherstatementlist2>
finally:
applique toujours ce bloc
53
Iterators : Introduction
Les itérateurs sont des objets qui permettent de parcourir des séquences
d'éléments (tels que des listes, des tuples, des chaînes, etc.). Ils sont créés en
utilisant des fonctions d'itération telles que iter() et iterable() ou les méthodes
de l'objet lui-même.
Un itérateur possède une méthode __next__() qui permet de récupérer l'élément
suivant dans la séquence à chaque appel. Une fois que tous les éléments ont été
parcourus, une exception StopIteration est levée.
Exemple : d'utilisation d'un itérateur pour parcourir une liste :
54
Iterators
Un itérateur est un objet qui représente une séquence de valeurs.
Exemple: Une classe qui implémente l'interface iterator de
Python. Cet itérateur calcule tous les nombres naturels un par un,
à partir de zéro:
class Naturals():
def __init__(self):
[Link] = 0
def __next__(self):
result = [Link]
[Link] += 1
return result
def __iter__(self):
return self
55
Iterators: __next__ Method
La méthode __next__ fait deux choses:
1. Calcule la valeur suivante
2. Vérifie s'il reste des valeurs à calculer
Pour retourner la valeur suivante dans la séquence,
l'itérateur effectue un calcul défini dans la méthode
next.
Lorsqu'il ne reste plus de valeurs à calculer, la méthode
suivante doit élever un type d'exception appelé
StopIteration. Cela signale la fin de la séquence.
Remarque: la méthode suivante définie ci-dessus ne
soulève aucune exception StopIteration.
56
Iterators: Exemple
Les itérateurs sont des objets qui ont des toujours les méthodes __next__
et __iter__:
class CountDown(object): >>> i = iter(range(5, 0, -1))
def __init__(self, start): >>> next(i)
[Link] = start + 1 5
def __next__(self): >>> next(i)
[Link] -= 1 4
if [Link] <= 0 >>> next(i)
raise StopIteration 3
return [Link] >>> next(i)
def __iter__(self): 2
return self >>> next(i)
1
>>> next(i)
>>> cd = CountDown(5) Traceback (most recent call
>>> for x in cd: last):
... print(x) File "<interactive input>",
5 4 3 2 1 0 line 1, in <module>
StopIteration
57
Iterators: __iter__ Method
Le but de la méthode __iter__ est de renvoyer un objet
itérateur.
Par définition: un Iterator est un objet qui a implémenté
les deux méthodes __next__ et __iter__.
Cela a une conséquence intéressante. Si une classe
implémente une méthode next et Une méthode iter, sa
méthode iter peut simplement retourner self (comme
dans l'exemple).
Puisque la classe implémente à la fois next et iter, elle
est techniquement un objet iterator, donc sa méthode
iter peut simplement revenir elle-même.
58
Iterators
59
Iterators
Les itérateurs ne peuvent être parcourus qu'une seule
fois, une fois que tous les éléments ont été récupérés, il n'est
plus possible de récupérer les éléments restants.
Pour parcourir à nouveau la séquence, il faut créer un
nouvel itérateur.
Il est également important de noter que les itérateurs ne
prennent pas en compte les modifications apportées à
la séquence d'origine après la création de l'itérateur.
Les itérateurs sont des objets efficaces pour parcourir des
séquences d'éléments en Python, mais il est important de
comprendre leurs limites et de les utiliser correctement pour
éviter les erreurs.
60
Iterators: itertools
la bibliothèque itertools fournit des outils supplémentaires pour les
itérateurs en Python, en permettant des opérations telles que la
combinaison, la répétition, la filtration et l'agrégation des itérateurs.
[Link](iterable, r) : génère toutes les combinaisons de longueur
r de l'itérateur donné.
[Link](iterable, r=None) : génère toutes les permutations
possibles de l'itérateur donné.
[Link](iterable, key_func) : regroupe les éléments consécutifs d'un
itérateur qui ont la même valeur de clé en utilisant la fonction de clé donnée.
[Link](iterable, start, stop[, step]) : retourne un itérateur qui retourne
des éléments spécifiques de l'itérateur donné en utilisant des arguments start, stop et
step.
[Link](start=0, step=1) : retourne un itératerateur qui génère une série
de nombres en utilisant les arguments start et step. Il est similaire à range(), mais il
retourne un itérateur plutôt qu'une liste.
Il existe également d'autres outils tels que [Link](), [Link](),
itertools.zip_longest()
61
Iterators: itertools
Exemple :
62
Iterators: itertools
Exemple :
63
Generator Functions
Les générateurs peuvent générer des itérateurs.
Les générateurs constituent une classe spéciale de fonctions qui
simplifient la tache dans l'écriture des itérateurs. Les fonctions
régulières calculent une valeur et la retournent, mais les générateurs
retournent un itérateur qui retourne un flux de valeur.
Une fonction de générateur est une fonction avec le rendement de
mot-clé yield dans son corps.
La déclaration de yield est similaire à une déclaration de return .
Cependant, alors qu'une instruction de return provoque la destruction
de l'environnement actuel après la sortie d'une fonction, une
instruction de yield amène l'environnement à être enregistré jusqu'à la
prochaine fois que __next__ est appelé, ce qui permet au
générateur de suivre automatiquement l'état d'itération.
64
Generator Functions
Une fonction de générateur est une fonction avec le rendement de mot-clé
yield dans son corps: >>> def count_down(value):
... for x in range(value, 0, -1):
... yield x
...
>>> c = count_down(5)
>>> next(c)
5
>>> next(c)
4
>>> next(c)
3
>>> next(c)
2
>>> next(c)
1
>>> next(c)
Traceback (most recent call last):
File "<interactive input>", line 1, in
<module>
StopIteration
65
Generator Functions
Les générateurs sont très utiles pour des tâches qui
nécessitent de générer des séquences infinies ou
de grandes quantités de données car ils ne
stockent pas toutes les données en mémoire
en même temps, mais les génèrent au fur et à mesure
qu'elles sont nécessaires.
Les générateurs ne peuvent être parcourus qu'une
seule fois, une fois qu'ils ont généré toutes les
valeurs, ils ne peuvent plus être utilisés.
Parcourir à nouveau les valeurs générées, Il faut
créer un nouveau générateur.
66
Generator Functions vs Iterators
Un itérateur est un objet qui permet de parcourir un
ensemble de données, en retournant une valeur à chaque
itération. Les itérateurs sont utilisés pour parcourir les éléments
d'une collection (comme une liste ou un dictionnaire) de manière
séquentielle.
Un générateur est une fonction spéciale qui permet de créer un
itérateur. Au lieu de retourner une valeur, une fonction génératrice
utilise le mot-clé yield pour retourner une valeur à chaque itération.
Les générateurs permettent de créer des itérateurs
personnalisés et de générer des séquences de manière efficace en
termes de mémoire.
Les générateurs sont utilisés pour créer des itérateurs, qui
sont utilisés pour parcourir des collections de données de manière
séquentielle.
67
Generator Functions vs Iterators
68
Class as decorator
Les décorateurs sont un outil très puissant et utile en
Python, car ils permettent aux programmeurs de modifier
le comportement d'une fonction ou d'une classe.
Les décorateurs permettent d’envelopper une autre
fonction afin d’étendre le comportement de la fonction
enveloppée, sans la modifier de façon permanente.
un décorateur peut être définit en tant que classe.
Le méthode de classes __call__.
Lorsqu'un utilisateur doit créer un objet qui fonctionne
comme une fonction, il est nécessaire de revenir à cette
fonction pour qu'elle puisse être utile.
69
Class as decorator
# Python program showing
# use of __call__() method
class MyDecorator:
def __init__(self, function):
[Link] = function
def __call__(self):
# We can add some code
# before function call
[Link]
# We can also add some code
# after function call.
function()
70
Class as decorator
Décorateur de classe avec * args et **kwargs:
Pour utiliser le décorateur de classe avec les arguments *args
et **kwargs, il faut utiliser une fonction __call__ et les deux
arguments sont passés dans une fonction donnée.
# Python program showing class decorator with
*args and **kwargs
class MyDecorator:
def __init__(self, function):
[Link] = function
function("M3I", "hello")
71
Class as decorator
Décorateur de classe avec * args et **kwargs:
Pour utiliser le décorateur de classe avec les arguments *args
et **kwargs, il faut utiliser une fonction __call__ et les deux
arguments sont passés dans une fonction donnée.
# Python program showing class
decorator with *args and **kwargs
class MyDecorator:
def __init__(self, function):
[Link] = function
some_function(3)
73
Class as decorator
Exemple
class ErrorCheck:
def __init__(self, function):
[Link] = function
def __call__(self, *params):
if any([isinstance(i, str) for i in params]):
raise TypeError("parameter cannot be a string !!")
else:
return [Link](*params)
@ErrorCheck
def add_numbers(*numbers): 6
return sum(numbers)
# returns 6 TypeError: parameter cannot be a string !!
print(add_numbers(1, 2, 3))
# raises Error.
print(add_numbers(1, '2', 3))
74
Class as decorator
Exemple
75
Class as decorator
Exemple
76
TP : iterator
Écrire une class qui nous donnera prochaine puissance de 2
dans chaque itération. L'exposant de puissance commence à
partir du zéro jusqu'à un numéro défini par l'utilisateur.
>>> a = PowTwo(4)
>>> i = iter(a)
>>> next(i) 1
>>> next(i) 2
>>> next(i) 4
>>> next(i) 8
>>> next(i) 16
>>> next(i)
Traceback (most recent call last): ...
StopIteration
[Link] ("""
UPDATE animal SET name = 'turtle'
WHERE name = 'snake'
""")
print ("%d rows were updated" % [Link] )
cur_name = "snake"
new_name = "turtle"
[Link] ("""
UPDATE animal SET name = %s
WHERE name = %s """, (new_name, cur_name))
print ("%d rows were updated" % [Link])
TP MYSQL/Python
Création d’un dictionnaire a partir de données:
#create a dictionary cursor so that column values
# can be accessed by name rather than by position
[Link] ()
cursor = [Link] ([Link])
[Link] ("SELECT name, category FROM animal")
result_set = [Link] ()
for row in result_set:
print ("%s, %s" % (row["name"], row["category"]) )
print ("%d rows were returned" % [Link] [Link] ())
Interfaces graphiques
Graphical User Interface (GUI)
TP1
TP2
TP3
Plus d’exemples
[Link]
Exemple
1. Crée un classe Personne qui contient juste le
nom et l’âge.
2. Protéger la classe avec __slots__
3. instancie un objet joe avec age 30
4. taper la commande joe.__slots__
5. ajouter une attribut ville avec la commande :
1. [Link]= ‘ Casablanca’
2. joe.__class__.city=‘Casblance’
3. Protéger la classe avec la notion méta-classe
TP : correction
class PersonMeta(type):
def __new__(mcs,name,bases,class_dict):
class_dict[‘__slots’__]=(‘name’,’age’,)
return type.__new__(mcs,name,bases,class_dict)
def__setattr__(cls,key,value):
if(hasattrib(cls,key):
return();__setattrib(key,value)
raise AttributeError(‘’ N’est pas definie’)
class Person(metaclass=PersonMeta):
pass