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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| #!/bin/env python
"""
Utiliser un descripteur ...
https://docs.python.org/fr/3/howto/descriptor.html
"""
import random
class EstObserve:
def __init__(self, funcs=None, instances=None):
"""
funcs : [function] : envoi notif vers function()
instances: [str] : envoi notif vers instanceclasse.on_event()
"""
if not funcs:
funcs = []
self.callbacks = funcs
if not instances:
instances = []
self.instances = instances
def __set_name__(self, owner, name):
self.name = "__" + name
def __get__(self, obj, objtype=None):
return getattr(obj, self.name)
def __set__(self, obj, value):
# print(f" update ..{self.name[2:]} en : {value}")
setattr(obj, self.name, value)
for call in self.callbacks:
call(self.name[2:], getattr(obj, self.name))
for call in self.instances:
try:
getattr(obj, call).on_event(self.name[2:], value)
except AttributeError:
pass
def ecouteur(name, data):
print(f"\t# receveur: var {name} == {data}")
def ecouteur2(name, data):
print(f"\t# est {'mineur' if data < 18 else 'majeur'}")
# if data < 18: exit(8)
class DataBase:
""" devrait exister une interface """
def on_event(self, name, data): # méthode obligatoire avec cette signature
print("\t# update dans bd ...")
class Personne:
age = EstObserve(
funcs=[ecouteur, ecouteur2],
instances=["db"]
)
def __init__(self, age) -> None:
self.age = age
self.db = DataBase() # recoit notif si age change
if __name__ == "__main__":
moi = Personne(18)
for _ in range(10):
moi.age = random.randint(16, 21)
print(f" Nouvel Age est: {moi.age}")
print() |
Partager