Professional Documents
Culture Documents
1. quelques pralables............................................................................................................2
1.1. un script......................................................................................................................................................2
1.2. dictionnaire.................................................................................................................................................3
1.3. classe d'un objet..........................................................................................................................................4
1.4. cas d'un hritage.........................................................................................................................................5
1.5. rsolution d'un attribut................................................................................................................................6
4. la cration d'instance.......................................................................................................12
4.1. problmatique...........................................................................................................................................12
4.2. la mthode __new__()..............................................................................................................................12
4.3. le script de rfrence ...............................................................................................................................13
4.4. la mthode __call__ par dfaut................................................................................................................13
4.5. le singleton avec __new__.......................................................................................................................14
4.6. le singleton avec __call__........................................................................................................................15
6. dcorateur.........................................................................................................................22
6.1. notion de dcorateur.................................................................................................................................22
6.2. traage des instances et des mthodes d'une classe..................................................................................23
6.3. traage des instances................................................................................................................................24
6.4. traage d'une mthode par enveloppement...............................................................................................25
6.5. traage de toutes les mthodes.................................................................................................................26
Python 3
page 1
1. quelques pralables
1.1. un script
Voici un script qui servira de base pour les scripts ultrieurs. On y trouvera les formats de recherche classiques
d'un attribut (valeur ou mthode) dans une classe ou une instance.
#!/usr/bin/python3
# -*- coding: utf-8 -*
# meta-test1-appel.py
class Test_Classe (object) :
varClasse = "varClasse : je suis une variable de classe"
def __init__ (self, p1, p2) :
object.__init__(self)
def fnLocale () :
print ( "\n"+"#"*30)
print ( "Je suis une fonction locale")
print ( "#"*30, "\n")
self.nom = p1.upper()
self.code = p2
self.methodeLocale = fnLocale
def display (self) :
print ( "\u2588 nom :", self.nom, "\u2688
# cration de l'instance
instanceTest = Test_Classe("Josphine", 17.37)
# mthodes d'affichage
instanceTest.display()
instanceTest.methodeLocale()
print ()
# tests d'appel
print ("valeur de instanceTest.nom : ", instanceTest.nom)
print ("valeur de instanceTest.varClasse :", instanceTest.varClasse)
print ()
# appel depuis la classe
print ("valeur de Test_Classe.varClasse :", Test_Classe.varClasse)
# deux appels non classiques
Test_Classe.display (instanceTest)
instanceTest.__class__.display (instanceTest)
nom : JOSPHINE
code : 17.37
##############################
Je suis une fonction locale
##############################
Python 3
page 2
1.2. dictionnaire
Tout objet a un attribut dictionnaire (__dict__) qui comporte les attributs propres de l'objet (pas ceux dont il
hrite, mais en incluant les objets redfinis) sous la forma clef/valeur ; la recherche d'un attribut se fait dans le
ou les dictionnaires relatifs l'objet qui utilise cet attribut. (pour savoir si un attribut appartient un objet ou ses
ascendants, utiliser la fonction pr-dfinie hasattr(). On trouvera ci-dessous une fonction globale qui affiche
le dictionnaire d'un objet. On notera que items() retourne un numrable (une vue), pas une liste comme dans
Python 2.
exemple portant sur le script qui prcde
#!/usr/bin/python3
# -*- coding: utf-8 -*
# meta-test2-dict.py
def fnDico (obj, msg) :
print ( "@"*30)
print ( ">>> ", msg)
listeKeys = []
maxlg = 0
for clef in obj.__dict__.keys() :
listeKeys.append (clef)
if len(str(clef)) > maxlg : maxlg = len(str(clef))
listeKeys.sort()
for clef in listeKeys :
print (("
"+str(clef)+" "*20)[:maxlg+4],"\u279e",obj.__dict__[clef])
print ( "@"*30, "\n")
class Test_Classe (object) :
varClasse = "varClasse : je suis une variable de classe"
def __init__ (self, p1, p2, pa1="ngoce", pa2="62") :
object.__init__(self)
def fnLocale () :
print ( "\n"+"#"*30)
print ( "Je suis une fonction locale")
print ( "#"*30, "\n")
self.nom = p1.upper()
self.code = p2
self.methodeLocale = fnLocale
def display (self) :
print ( "\u2588 nom :", self.nom, "\u2688
# cration de l'instance
instanceTest = Test_Classe("Josphine", 17.37)
# test de hasattr()
print ('hasattr (Test_Classe, "__name__ >>>"',hasattr (Test_Classe, "__name__"))
# dictionaires :
fnDico (instanceTest, "dict de l'instance")
fnDico (Test_Classe , "dict de la classe Test_Classe")
fnDico (object, "dict de l'objet racine object")
hasattr (Test_Classe, "__class__ >>>" True
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
>>> dict de l'instance
code
17.37
methodeLocale <function Test_Classe.__init__.<locals>.fnLocale at 0x7f46cb7fd200>
nom
JOSPHINE
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
>>> dict de la classe Test_Classe
Python 3
page 3
__dict__
<attribute '__dict__' of 'Test_Classe' objects>
__doc__
None
__init__
<function Test_Classe.__init__ at 0x7f46cb7fd560>
__module__
__main__
__weakref__ <attribute '__weakref__' of 'Test_Classe' objects>
display
<function Test_Classe.display at 0x7f46cb809950>
varClasse
varClasse : je suis une variable de classe
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
>>> dict de l'objet racine object
__class__
<attribute '__class__' of 'object' objects>
__delattr__
<slot wrapper '__delattr__' of 'object' objects>
__dir__
<method '__dir__' of 'object' objects>
__doc__
The most base type
__eq__
<slot wrapper '__eq__' of 'object' objects>
__format__
<method '__format__' of 'object' objects>
__ge__
<slot wrapper '__ge__' of 'object' objects>
__getattribute__ <slot wrapper '__getattribute__' of 'object' objects>
__gt__
<slot wrapper '__gt__' of 'object' objects>
__hash__
<slot wrapper '__hash__' of 'object' objects>
__init__
<slot wrapper '__init__' of 'object' objects>
__le__
<slot wrapper '__le__' of 'object' objects>
__lt__
<slot wrapper '__lt__' of 'object' objects>
__ne__
<slot wrapper '__ne__' of 'object' objects>
__new__
<built-in method __new__ of type object at 0x8e51a0>
__reduce__
<method '__reduce__' of 'object' objects>
__reduce_ex__
<method '__reduce_ex__' of 'object' objects>
__repr__
<slot wrapper '__repr__' of 'object' objects>
__setattr__
<slot wrapper '__setattr__' of 'object' objects>
__sizeof__
<method '__sizeof__' of 'object' objects>
__str__
<slot wrapper '__str__' of 'object' objects>
__subclasshook__ <method '__subclasshook__' of 'object' objects>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Python 3
page 4
__itemsize__
<member '__itemsize__' of 'type' objects>
__module__
<attribute '__module__' of 'type' objects>
__mro__
<member '__mro__' of 'type' objects>
__name__
<attribute '__name__' of 'type' objects>
__new__
<built-in method __new__ of type object at 0x8e54e0>
__prepare__
<method '__prepare__' of 'type' objects>
__qualname__
<attribute '__qualname__' of 'type' objects>
__repr__
<slot wrapper '__repr__' of 'type' objects>
__setattr__
<slot wrapper '__setattr__' of 'type' objects>
__sizeof__
<method '__sizeof__' of 'type' objects>
__subclasscheck__
<method '__subclasscheck__' of 'type' objects>
__subclasses__
<method '__subclasses__' of 'type' objects>
__weakrefoffset__
<member '__weakrefoffset__' of 'type' objects>
mro
<method 'mro' of 'type' objects>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
On attire l'attention sur les attributs de type redfinis dans type, comme __doc__, __dict__ et quelques autres
attributs qui serviront dans la suite : __base__, __bases__, __name__, __subclasses__
Attention ne pas confondre classe et hritage ! La classe d'une classe s'appelle sa mtaclasse (metaclass)
Ici, il n'apparat qu'une seule mtaclasse qui s'appelle type. Elle est sa propre mtaclasse ! Cette mtaclasse
type n'en hrite pas moins de object.
# cration de l'instance
instanceTest = Test_Classe("Josphine", 17.37)
instanceTest.display()
print ("instanceTest.varSuper >>> ", instanceTest.varSuper)
print ("instanceTest.titre >>> ", instanceTest.titre)
print ()
# dictionnaire
fnDico (instanceTest, "instanceTest")
Python 3
page 5
# classes
print ("Super_Classe.__class__ >>> ", Super_Classe.__class__)
print ("Test_Classe.__name__>>> ", Test_Classe.__name__)
print ("Test_Classe.__base__ >>> ", Test_Classe.__base__)
print()
print (dir (instanceTest))
print (dir(Test_Classe))
nom : JOSPHINE code : 17.37
instanceTest.varSuper >>> varSuper : je suis une variable de classe
instanceTest.titre >>> test de super classe
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
>>> instanceTest
code
17.37
methodeLocale <function Test_Classe.__init__.<locals>.fnLocale at 0x7f2018c1b950>
nom
JOSPHINE
titre
test de super classe
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Super_Classe.__class__ >>> <class 'type'>
Test_Classe.__name__>>> Test_Classe
Test_Classe.__base__ >>> <class '__main__.Super_Classe'>
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__',
'__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'code', 'display',
'methodeLocale', 'nom', 'titre', 'varClasse', 'varSuper']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__',
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__',
'__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'display', 'varClasse',
'varSuper']
Python 3
page 6
* mthode de classe
C'est la moins utilise de trois genres de mthodes ; lors de la dclaration, le premier paramtre appel
usuellement cls (mais l aussi, c'est indiffrent) et ce paramtre prend la valeur de la classe, que la mthode soit
appele depuis la classe ou depuis une instance.
Il existe plusieurs faons de dclarer le genre de la mthode ; la plus sure est d'utiliser les fonctions prdfinies
staticmethod() et classmethod(). Il n'y a pas d'indication spciale pour les mthodes d'instance. On
vitera les commodits apportes en Python 3, comme de considrer comme statique une fonction sans
paramtre. L'autre procd est d'utiliser les dcorateurs (voir un exemple au paragraphe 2.3).
Python 3
page 7
##############################
Je suis une fonction locale
##############################
je suis une fonction redfinie en mthode
appele globalement
avec deux paramtres
**********************
je suis une fonction redfinie en mthode
<__main__.Test_Classe object at 0x7f73c6543f90>
appel depuis une instance, avec un paramtres
**********************
je suis une fonction redfinie en mthode
<__main__.Test_Classe object at 0x7f73c6543f90>
appel depuis la classe, avec (deux) paramtres
**********************
je suis une fonction redfinie en mthode
appel depuis la classe
deux vrais paramtres
**********************
je suis une fonction redfinie en mthode
static : appel depuis une instance,
avec deux paramtres
**********************
je suis une fonction redfinie en mthode
static : appel depuis la classe,
avec deux paramtres
**********************
je suis une fonction redfinie en mthode
<class '__main__.Test_Classe'>
class : appel depuis une instance (un paramtre)
**********************
je suis une fonction redfinie en mthode
<class '__main__.Test_Classe'>
class : appel depuis la classe (un paramtre)
**********************
La ligne prcdente provoque une erreur en Python2 ; en Python3, lorsque la mthode d'instance
methodeInstanceFnGlobale() est appele par une classe, la diffrence de Python 2, aucun contrle n'est
fait sur le premier paramtre et elle se comporte comme une mthode statique.
Python 3
page 8
Python 3
page 9
Dit d'une autre faon, instCl devient une fonction de paramtres p1, p2, p3 ...
classes callables dj rencontre.
On utilise dans l'instanciation le nom de la classe comme nom d'une fonction. Par exemple :
instanceTest = Test_Classe("Josphine", 17.37)
Comment cela peut-il s'oprer, en restant dans la logique lmentaire de Python ? Dans cet appel, Test_Classe
dsigne alors une fonction, qui prend des paramtres, retourne une instance initialise. L'initialisation se fait par
un appel __init__() en lui passant exactement le bon nombre de paramtres, c'est dire l'instance, et les
paramtres rels dfinis dans l'appel. Cela implique au pralable que cette fonction __call__ ait cr cette
instance.
Mais il ne faut pas oublier que l'on doit faire l'appel sur une instance, Test_Classe.
On peut en conclure :
1. la mtaclasse de Test_Classe (soir : Test_Classe__.__class__) comporte une mthode d'instance
__call__ (dfinie ou hrite)
2. cette mthode d'instance, lors de l'appel, doit prendre comme premier paramtre le nom de l'instance
crer de Test_Classe
3. elle doit crer de toutes pices une telle instance.
4. elle doit faire un appel Test__Classe.__init__() en lui passant les bons paramtres (voir les sections
1 et 2), ce qui implique que la signature de l'appel de Test_Class() doit tre conforme l'attente du
__init__().
5. elle doit retourner l'instance cre et initialise de Test_Classe.
un script d'illustration
Pour vrifier au moins partiellement les 5 propositions qui prcdent, voici un petit script d'illustration.
#!/usr/bin/python3
# -*- coding: utf-8 -*
# meta-test6-call.py
class Test_Classe (object) :
varClasse = "varClasse : je suis une variable de classe"
def __init__ (self, p1, p2) :
object.__init__(self)
self.nom = p1.upper()
self.code = p2
def display (self, p1 = "") :
print ("display : ", p1)
print ( "\u2588 nom :", self.nom, "\u2688
print ("~"*40, "\n")
Python 3
page 10
On peut vrifier que type, mtaclasse de Test_Classe possde bien une mthode __call__ dans la section
sur les dictionnaires ( 1.3.). Un slot est une fonction ; wrapper signifie que la fonction enveloppe une autre
fonction, non visible, c'est dire est capable d'excuter la fonction enveloppe, mais an plus, d'assurer d'autres
services.
On peut s'interroger sur la troisime partie de l'exemple. Pourquoi le procd n'est-il pas adapt, mme s'il
parat fonctionner ? Si on vrifie la rsolution de l'attribut __call__ dans Test_Classe.__call__(), on
voit qu'il est appel partir de Test_Classe : c'est une classe et l'attribut et recherch dans cette classe. Ce n'est
que parce que la classe Test_Classe n' a pas cet attribut que Python considre que Test_Classe est une
instance, et qu'il faut chercher dans sa mtaclasse. Cette recherche est alors un succs. Mais si Test_Classe
avait t callable, le droulement aurait t tout diffrent (et fautif)
3.3. en complment
On peut lgitimement se demander si les fonctions ne sont pas elles aussi les instances d'une classe callable. On
Python 3
page 11
trouvera ci-dessous un test qui permet de rponde par l'affirmative. Python n'offre pas de dmarche simple pour
aller plus loin (comme c'est le cas en JavaScript).
#!/usr/bin/python3
# -*- coding: utf-8 -*
# meta-test8-fonction.py
def fnTest (p1, p2) :
print ("appel de la fontion fnTest")
print (p1)
print (p2)
fnTest ("Jean-Franois", "04/10/1937")
print ()
fun = fnTest.__class__
print (fun)
print ()
fun.__call__(fnTest, "Marc_Antoine", "12/08/1958")
appel de la fontion fnTest
Jean-Franois
04/10/1937
<class 'function'>
appel de la fontion fnTest
Marc_Antoine
12/08/1958
4. la cration d'instance
4.1. problmatique
* On rappelle la problmatique :
la classe :
class Test_Classe (object) :
page 12
redfinition de __call__() et on peut aussi en faire une mthode statique, ou mme une fonction globale ! On
verra ultrieurement ce qu'il faut dclarer pour le __call__() par dfaut, celui hrit de type.
display (self))")
Bien prendre garde que __call__ est une mthode d'instance ! et que comme elle est appele depuis une
instance, (ici, la classe Test_Classe) son paramtre usuellement appel self, et ici selfcls pour bien montrer la
diffrence et que l'on dsigne par selfcls la classe instance callable Test_Classe.
Python 3
page 13
self.nom = parNom
self.code = parCode
def display (self) :
print ("\u27a8 trace \u27a8
print (self.nom, self.code)
display (self))")
*l dsigne les paramtres numrs (0, 1 ou plus) et **kw les paramtres formels mots clef qui suivent. Pour
le rappeler nous les nommerons plutt *ven, et **vkw (variables numres et variables mots clefs).
display (self))")
Python 3
page 14
Le procd consiste conserver dans la classe une rfrence sur l'instance et de demander __new__ de
retourner cette instance.
#!/usr/bin/python3
# -*- coding: utf-8 -*
# meta-test12-sing-new.py
class Test_Classe_Singleton (object) :
__refInstance = None
def __new__ (cls, *ven, **vkw) :
if cls.__refInstance == None :
return object.__new__(cls)
return cls.__refInstance
def __init__ (self, parNom, parCode) :
if self.__class__.__refInstance == None :
self.nom = parNom
self.code = parCode
self.__class__.__refInstance = self
def display (self, p) :
print (p, self.nom, self.code)
instanceTest = Test_Classe_Singleton ("Michel", 12.03)
instanceTest.display("instanceTest")
autreInstance = Test_Classe_Singleton ("N'importe", 12.14)
autreInstance.display("autreInstance")
print ("instanceTest == autreInstance : ", instanceTest == autreInstance)
del (instanceTest)
autreInstance.display("autreInstance")
instanceTest Michel 12.03
autreInstance Michel 12.03
instanceTest == autreInstance :
autreInstance Michel 12.03
True
Ne pas oublier que del() supprime la rfrence, pas l'objet ! Pour supprimer un objet en Python, il faut
supprimer toutes ses rfrences ; dans le cas prsent, si une instance est cre, il n'existe pas de moyen simple de
la supprimer.
Python 3
page 15
True
Python 3
page 16
17.34
Python 3
page 17
~~~~~~~~~~
Meta_Test.__base__ >>> <class '__main__.Super_Meta_Test'>
Super_Meta_Test.__base__ >>> <class 'type'>
~~~~~~~~~~
type.__base__ >>> <class 'object'>
******************************
object_.__class__ >>> <class 'type'>
Super_Test_Classe.__class__ >>> <class 'type'>
Test_Classe.__class__ >>> <class '__main__.Meta_Test'>
Infra_Test_Classe.__class__ >>> <class '__main__.Meta_Test'>
~~~~~~~~~~
Meta_Test.__class__ >>> <class 'type'>
Super_Meta_Test.__class__ >>> <class 'type'>
~~~~~~~~~~
type.__class__ >>> <class 'type'>
schma rsum
page 18
Python 3
page 19
"""
class Test_Classe (Super_Test_Classe) :
titre = "je suis la classe cre dynamiquement "
def __init__ (self, parNom, parCode, parNation) :
Super_Test_Classe.__init__(self, parNation)
self.nom = parNom
self.code = parCode
def display (self) :
self.displaySuper()
print (">> nom : ",self.nom, " //
"""
class Meta_Test_Classe (type) :
def __new__ (selfcls, nom, parents, dico) :
# locale pour dfinir le __init__ de la classe
def initialiser (p0, p1, p2, p3) :
p0.__class__.__bases__[0].__init__ (p0, p3)
p0.nom = p1
p0.code = p2
# enrichissement du dictionaire
dico ["__init__"] = initialiser
fnDict (dico, "excution du __new__ de la mtaclasse")
# le __new__ de selfcls est laiss par dfaut sur type
return type.__new__ (selfcls, nom, parents, dico)
def __init__ (selfcls, nom, parents, dico) :
# locales pour dfinir les mthodes de la classe
def afficher (p0) :
p0.displaySuper()
print (">> nom : ",p0.nom, " // code : ", p0.code)
def donnerTitre (p0) :
print (p0.titre + p0.__class__.__name__)
fnDict (dico, "paramtre pour __init__ de la mtaclasse")
# enrichissement du dictionnaire
type.__init__(selfcls, nom, parents, selfcls.__dict__)
selfcls.display = afficher
selfcls.getTitre = donnerTitre
fnDict (selfcls.__dict__, "excution du __init__ de la mtaclasse")
Python 3
page 20
##############################
>>> excution du __init__ de la mtaclasse
__doc__
None
__init__
<function Meta_Test_Classe.__new__.<locals>.initialiser at 0x7fa90d9d1290>
__module__ __main__
display
<function Meta_Test_Classe.__init__.<locals>.afficher at 0x7fa90d99a440>
getTitre
<function Meta_Test_Classe.__init__.<locals>.donnerTitre at 0x7fa90d99a4d0>
titre
je suis la classe cre dynamiquement
##############################
##############################
>>> instanceClasse
__doc__
None
__init__
<function Meta_Test_Classe.__new__.<locals>.initialiser at 0x7fa90d9d1290>
__module__ __main__
display
<function Meta_Test_Classe.__init__.<locals>.afficher at 0x7fa90d99a440>
getTitre
<function Meta_Test_Classe.__init__.<locals>.donnerTitre at 0x7fa90d99a4d0>
titre
je suis la classe cre dynamiquement
##############################
> nationalit : espagnol
>> nom : jean-philippe // code : 18.22
je suis la classe cre dynamiquement Test_Classe
>>>
Python 3
page 21
6. dcorateur
Il existe un framework complet de Python sur les dcorateurs. Son tude n'est pas l'objet de cette sections.
Python 3
page 22
selfcls.methodeClasse = methode
print ("~~~~~~~ adresse de la mthode wrapper : ", hex(id(methode)))
class Test_Classe (object, metaclass = Meta_Test) :
titre = "je suis la classe trace nomme "
def __init__ (self, parNom, parCode) :
self.nom = parNom
self.code = parCode
def display (self) :
""" cette mthode display est documente """
print (">>> nom : "+self.nom, " // code : ", self.code)
def getTitre (self) :
return ">>>>>> "+ self.titre
+ self.__class__.__name__
python
est un langage rflexif
Python 3
page 23
17.52
+++
l'instance cre a pour id : 0x7f0330df0150
+++
>>> nom :
Franis
//
code :
15.53
Python 3
page 24
Python 3
page 25
17.52
* Quoique parfaitement correct et rpondant a minima au cahier des charges, plusieurs points restent
insatisfaisants : la mthode a t correctement enveloppe, mais le nom, et la documentation ne sont pas
satisfaisant, et si la mthode originelle avait possd des attributs propres, leur accs est compromis.
* Un autre problme se serait pos si la mthode avait retourn une valeur, comme la mthode getTitre().
* Comme dans la question suivante , ce sont toutes le mthodes dclares que l'on veut envelopper, il va falloir
en plus dtecter toute les mthodes dclares parmi les attributs. Une mthode est un objet de type fonction. Il y
a plusieurs manire de voir si un objet est une fonction :
- soit en regardant si le type de l'objet est le type fonction ; ce type est un objet du module types (qu'il
faut importer) et se nomme FunctionType. Il s'agit ici d''tre, pas tre gal et l'oprateur est is,
mme si == fonctionne !.
- soit en comparant le type de l'objet au type d'une fonction connue. Par exemple lambda : 0
On trouvera donc :
type (methode) is types.FunctionType
type (methode) is type(lambda : 0)
Python 3
page 26
return fregoli
nouveauDico = {} # le dico de l'enveloppe du Test_Classe
for clef in dico : # c'est le dico original
valeur = dico[clef]
if type(valeur) is type(lambda : 0) :
nouvelleMethode = enveloppeur (clef, valeur)
nouveauDico.update ({clef:nouvelleMethode})
else :
nouveauDico.update ({clef: valeur})
return type.__new__ (selfcls, nom, parents, nouveauDico)
def __init__ (selfcls, nom, parents, dico) :
parent = parents[0]
def nouveau (p0, p1, p2) :
inst = parent.__new__(p0)
print ("\n+++\nl'instance cre a pour id :",hex(id(inst)),"\n+++\n")
return inst
def effacer (p0) :
print ("\n---\nl'instance suivante va disparatre :", hex(id(p0)),"\n---\n")
selfcls.__new__ = nouveau
selfcls.__del__ = effacer
class Test_Classe (object, metaclass=Meta_Trace_Test_Classe) :
titre = "je suis la classe trace nomme "
def __init__ (self, parNom, parCode) :
self.nom = parNom
self.code = parCode
def display (self) :
""" cette mthode display est documente """
print (">>> nom : ",self.nom, " // code : ", self.code)
def getTitre (self) :
return ">>>>>> "+ self.titre
+ self.__class__.__name__
# cration d'instances
instanceClasse = Test_Classe ("jean-marc", 17.52)
instanceClasse.display()
print (instanceClasse.getTitre ())
autreInstance = Test_Classe ("antoinette", 11.48)
autreInstance.display()
# contrles d'atributs
print ("\n************** contrles *****************")
print ("le nom de la mthode display :",Test_Classe.display.__name__)
print ("la doc de la mthode display :",Test_Classe.display.__doc__)
print ("!!!!!!! hi! hi hi! !!!!!")
# suppression d'instances
aliasInstanceClasse = instanceClasse
print ("\nsuppression de la rfrence instanceClasse " )
del (instanceClasse)
print ("suppression de la rfrence aliasInstanceClasse ")
del (aliasInstanceClasse)
+++
l'instance cre a pour id : 0x7f29d32d00d0
+++
>>> nom :
jean-marc
//
code :
17.52
Python 3
page 27
>>> nom :
antoinette
//
code :
11.48
Python 3
page 28