class, surcharge, incompréhension.

class, surcharge, incompréhension. - Python - Programmation

Marsh Posté le 13-01-2005 à 20:33:51    

j'ai une classe de base Handler

Code :
  1. class Handler:
  2.     def __init__(self):
  3.         ...
  4.     def emit(self, record):
  5.         ...
  6.     def handleError(self, record):
  7.         ...


 
ensuite j'ai une classe Null qui hérite de Handler.
mais qui change emit (surcharge c'est çà ?)

Code :
  1. class Null(Handler):
  2.     def emit(self, record):
  3.         pass


 
et une autre class Console qui hérite de Handler aussi.
 

Code :
  1. class Console(Handler):
  2.     def handleError(self, record):
  3.         ...
  4.         # handleError, est appelé à chaque fois que emit
  5.         # produit une exception, je testes ici si l'exception
  6.         # est de type ValueError ou qu'il ny a pas 5 emit foireux
  7.         # à la suite, si c'est le cas je voudrais désactiver emit.
  8.         # en fait que emit de Console devienne le emit de Null pour
  9.         # qu'il passe seulement.


 
et je captes pas comment faire pour surcharger les méthodes de la classe
Console par celle de Null à partir de Console.handleError, merci d'avance.

Reply

Marsh Posté le 13-01-2005 à 20:33:51   

Reply

Marsh Posté le 13-01-2005 à 21:50:48    

Code :
  1. class Handler(object):
  2.     def emit(self, x):
  3.         print "Handler.emit"
  4.     def handle_error(self, e):
  5.         print "Handler.handle_error"
  6.         self.emit(e)
  7. class AntiSpam(Handler):
  8.     def __init__(self):
  9.        
  10.         super(Handler, self).__init__()
  11.         self.__spam = 5
  12.     def emit(self, e):
  13.         if self.__spam == 0:
  14.             def void(*args):
  15.                 pass
  16.            
  17.             self.emit = void
  18.             return
  19.         self.__spam -= 1
  20.         Handler.emit(self, e)
  21. a = AntiSpam()
  22. for i in range(10):
  23.     a.handle_error(i)


 
 
 
si tu veux un truc passe partout plutot que la fonction void
 
http://cvs.gnome.org/viewcvs/gdesk [...] iew=markup
 
self.emit = Null
 
et là t'es blindé

Reply

Marsh Posté le 13-01-2005 à 22:12:14    

si tu dois vraiment changer le comportement en profondeur,; il faut te tourner vers le Design Pattern Stratégie. Tu peux la jouer:
 
- classique : tu délègues. Ta classe n'as qu'un seul attribut "self.__impl" que tu changes à souhait. "self.__impl = NullImpl()" par exemple, pour le reste, pour chaque méthode de ta classe de façade, il faut déléguer (tu peux le faire manuellement ou faire ça tout seul avec __getattr__
 
- rebelle : tu peux changer de __class__ à la volée :)

Reply

Marsh Posté le 13-01-2005 à 23:01:55    

Design Pattern strategy [:alph-one]
 
non attends t'enflammes pas, je vais déja regarder tout çà tranquillement et à tête reposée et essayer de comprendre..
 
si tu veux le résultat que j'essayes d'obtenir, je pourrais le faire facilement
mais surement pas de façon pratique et élégante et c'est ce que j'essayes de faire,
toujours à mon niveau biensur hein, mais j'avances pas vite par contre  :sweat:  
 
en tous les cas je te remercies, et je vais tester tout çà :o  ;)  

Reply

Marsh Posté le 13-01-2005 à 23:40:05    

DesignPattern Stratégie : t'as une façade et derrière différentes implémentations aux comportements différents. Tu changes la partie arrière à ta guise (ici, désactivation de certaine méthodes) sans qu'en façade l'interface ne change.
 
 
 
Sinon, mon exemple, l'est pas bon pour toi ?

Reply

Marsh Posté le 13-01-2005 à 23:41:30    

http://www.dofactory.com/Patterns/PatternStrategy.aspx
 
les exemples C# sont compréhensibles il me semble

Reply

Marsh Posté le 14-01-2005 à 17:03:20    

Taz a écrit :


Sinon, mon exemple, l'est pas bon pour toi ?


ca fonctionne, mais c'est pas ce que je veux faire
 

Code :
  1. class ConsoleHandler(Handler):
  2.     eagain = 0
  3.     def handleError(self, record):
  4.         self.eagain += 1
  5.         if sys.exc_info()[0] is ValueError or self.eagain > 5:
  6.              # print >>f, 'real emit dying..'
  7.              self.emit = self.null
  8.    
  9.     def null(self, record):
  10.          # print >>f, 'new emit -> pass'
  11.          pass


 
ca marche, mais je veux me servir de ma classe NullHandler qui est fait pour çà, plutôt que d'être obligé de créer une nouvelle méthode null et de l'assigner à emit.
 

Citation :

- rebelle : tu peux changer de __class__ à la volée :)


self.__class__ = NullHandler
bha ca me va bien ca, hier j'ai pourtant testé et mon emit n'était plus appelé  :sleep: , mais là ca fonctionne nickel, ca risque rien de changer de classe comme ca ?
 
merci pour tout.  
 
 
 
 

Reply

Marsh Posté le 14-01-2005 à 22:35:34    

rebinder __class__ c'est plus compliqué ça. Et c'est pas très sur. Moi je te conseille de te pencher sur le Strategy Pattern

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed