[python] vzor Observer a predavani metody v parametru

Ondrej Penicka penicka na web2day.org
Úterý Listopad 14 06:32:04 CET 2006


Zdravim,

pri implementaci vzoru observer jsem narazil na problem s predavanim
metody vychozi tridy vsech pozorovatelu. Subjekt je trida sledovaneho
objektu, Observer vzorova trida pro pozorovatele a ConcreteObserver
priklad pozorovatele. Zadrhel je v tride myList, ktera udrzuje seznam
pozorovatelu a definuje funkci call, ktera pro kazdou polozku zavola
predanou funkci (Observer.update). Pri volani predane funkce s objektem
jako parametr (namisto self) se samozrejme vola funkce Observer.update
namisto ConcreteObserver.update i kdyz self ukazuje na instanci
ConcreteObserver.

class myList:
   def call(self, function, subject):
      for item in self.list:
         function(item, subject);

class Subjekt:
   def __init__(self):
       self.observers = myList
   def updateAll(self):
      self.myList.call(Observer.update, self)

class Observer:
   def update(self, subjekt):
      print "virtual Observer method called"

class ConcreteObserver(Observer):
   def update(self, subjekt):
      print "change something"

Neprilis elegantni reseni je v metode Observer.update volat
self.update_real()

class Observer:
   def update(self, subjekt):
      self.update_real(subjekt)

class ConcreteObserver(Observer):
   def update_real(self, subjekt):
      print "change something"

Pravdepodobne je to dusledek toho, ze se v pythonu i trida chova jako
objekt.
Neni nejake lepsi reseni, aniz bych zasahoval do tridy myList?

Diky, Ondrej Penicka



Další informace o konferenci Python