OVH Cloud OVH Cloud

Problème d'instantiation

2 réponses
Avatar
jean.moser
>>> class Transaction:
def __init__(self):
self.lines =3D []
def addLine(self,account,amount):
self.lines.append((account,amount))
return self.lines


>>> T1 =3D Transaction()
>>> T1.addLine('tiers',300)
[('tiers', 300)]
>>> T1.addLine('caisse',-300)
[('tiers', 300), ('caisse',- 300)]

Il s'agit d'une transaction comptable classique.Ceci est une partie du
code simplifi=E9 propos=E9 par Andy Robinson dans son ouvrage "Python
programming on Window "(p 77 et suivantes).C'est une solution qui fait
appel =E0 deux comptes, un de d=E9bit, l'autre de cr=E9dit, contrairement
=E0 l'exemple de Beazley page 71 de son "Essential reference" qui ne
traite qu'un seul compte.
Seulement j'ai un petit probl=E8me. Si j'instantie la transaction par T1
puis par T2, comme cela devrait =EAtre classiquement le cas, T2 =E9crase
T1 dans la liste lines. La solution que j'ai trouv=E9 c'est d'instantier
deux fois fois avec le m=EAme T1.Si j'appelle le dictionnaire par
T1.__dict__, j'obtiens bien une ligne compl=E8te de transactions.
Comment faire?

Jean Moser

2 réponses

Avatar
tiissa
wrote:
class Transaction:




def __init__(self):
self.lines = []
def addLine(self,account,amount):
self.lines.append((account,amount))
return self.lines

Seulement j'ai un petit problème. Si j'instantie la transaction par T1
puis par T2, comme cela devrait être classiquement le cas, T2 écrase
T1 dans la liste lines.


Je ne suis pas sûr d'avoir compris cette dernière phrase.
Dans le code au dessus, 'lines' est un attribut des objet de la classe
Transaction ("self.lines"). Chacun de ces objets va donc avoir une liste
vide à sa création mais les listes des autres objets ne sont pas modifiées.
En particulier, après la création de T2, T1.lines contient encore toutes
les lignes enregistrées dans T1.

Si l'objectif est que la liste des lignes soit partagées entre toutes
les instances de la classe Transaction, il faut en faire un attribut de
la classe (Transaction.lines) et non plus de l'objet (self.lines).




Avatar
jean.moser
Merci pour la réponse. Effectivement la transaction T1 subsiste et
c'est bien ce que je veux.

wrote:
class Transaction:




def __init__(self):
self.lines = []
def addLine(self,account,amount):
self.lines.append((account,amount))
return self.lines

Seulement j'ai un petit problème. Si j'instantie la transaction par T1
puis par T2, comme cela devrait être classiquement le cas, T2 écrase
T1 dans la liste lines.


Je ne suis pas sûr d'avoir compris cette dernière phrase.
Dans le code au dessus, 'lines' est un attribut des objet de la classe
Transaction ("self.lines"). Chacun de ces objets va donc avoir une liste
vide à sa création mais les listes des autres objets ne sont pas modi fiées.
En particulier, après la création de T2, T1.lines contient encore tou tes
les lignes enregistrées dans T1.

Si l'objectif est que la liste des lignes soit partagées entre toutes
les instances de la classe Transaction, il faut en faire un attribut de
la classe (Transaction.lines) et non plus de l'objet (self.lines).