[Destructeur] avec des references sur un autre objet
bonjour,
je ne suis pas un pro du python mais j'ai voulu faire un notificateur a la mode event du c# (enfin en version plus simple)
bref
j'ai ce code
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class Updater:
fluxs = []
def __init__(self, parking, pkname, logger = None):
print("> Updater constructeur")
self.name = pkname
self.onPark = parking['OnPark']
self.totalPark = parking['TotalPark']
self.logger = logger
def __del__(self):
print("> Updater descturcteur")
self.__save()
def __iadd__(self, fluxToAdd):
if not issubclass(fluxToAdd.__class__, BaseRunningFlux):
raise Exception(f"{fluxToAdd.__class__.__name__} n'herite pas de BaseRunningFlux")
fluxToAdd.notifyFunc = self.changed
self.fluxs.append(fluxToAdd)
return self
def __save(self):
if os.path.exists(self.name):
try:
with open(self.name , 'w') as f:
f.write(f"{{\n")
f.write(f"\t\"OnPark\": {self.onPark},\n")
f.write(f"\t\"TotalPark\": {self.totalPark}\n")
f.write(f"}}\n")
f.close()
except Exception as error:
raise error |
j'ai pas mis tt la classe le reste est sans importance
bref quand j'ajoute un objet qui hérite de BaseRunningFlux je lui colle une fonction pour qu'il me notifie ses changements de valeur a la classe parent via sa fonction changed
avec un truc dans ce style
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| class BaseRunningFlux:
@abstractmethod
def __init__(self):
self.notifyFunc = None
self.count = 0
def __del__(self):
self.notifyFunc = None
@property
def notifyFunc(self):
return self._notifyFunc
@notifyFunc.setter
def notifyFunc(self, value):
self._notifyFunc = value
@property
def count(self):
return self._count
@count.setter
def count(self, value):
self._count = value
if not self.notifyFunc is None: self.notifyFunc(self)
def reset(self):
self._count = 0
class RunnigFlux(BaseRunningFlux):
def __init__(self):
BaseRunningFlux.__init__(self) |
sauf que quand je fais un del sur ma classe
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| upd = Updater(parking, parkname)
print(f"etat parking : {upd}")
f = RunnigFlux()
f.count = 5
upd += f
print(f"etat parking : {upd}")
f = RunnigFlux()
f.count = -3
upd += f
print(f"etat parking : {upd}")
print()
print("test ajouter par ++")
f.count += 1
f.count += -1
# Reinit
print()
print()
reinit = 12
print(f"REINIT a {reinit}")
upd.reinit(reinit)
print(f"etat parking : {upd}")
#upd += Dummy()
print("avant destructeur")
del upd
print("apres destructeur") |
il n'est pas réalisé a ce moment la mais a la fin du logiciel
or comme je sauve un fichier la fonction open ne plus accessible
et si je désactive la ligne #fluxToAdd.notifyFunc = self.changed
la le del est fait a ce moment la
bref je comprends pas trop