Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
641 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  class, surcharge, incompréhension.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

class, surcharge, incompréhension.

n°952649
Profil sup​primé
Posté le 13-01-2005 à 20:33:51  answer
 

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.

mood
Publicité
Posté le 13-01-2005 à 20:33:51  profilanswer
 

n°952689
Taz
bisounours-codeur
Posté le 13-01-2005 à 21:50:48  profilanswer
 

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é

n°952701
Taz
bisounours-codeur
Posté le 13-01-2005 à 22:12:14  profilanswer
 

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 :)

n°952730
Profil sup​primé
Posté le 13-01-2005 à 23:01:55  answer
 

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  ;)  

n°952750
Taz
bisounours-codeur
Posté le 13-01-2005 à 23:40:05  profilanswer
 

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 ?

n°952751
Taz
bisounours-codeur
Posté le 13-01-2005 à 23:41:30  profilanswer
 

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

n°953233
Profil sup​primé
Posté le 14-01-2005 à 17:03:20  answer
 

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.  
 
 
 
 

n°953398
Taz
bisounours-codeur
Posté le 14-01-2005 à 22:35:34  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  class, surcharge, incompréhension.

 

Sujets relatifs
class qui gere une arborescence?Surcharge d'operateur et compilation
Surcharge graphique d'un Checkbox[class] Surcharge d'opérateur +
Probleme class java + windows xpProbleme class java + windows xp
prob de surcharge de constructeur[jsp]problème à la compilation : class file contains wrong class
[Class] Constructeur et allocation de mémoire. 
Plus de sujets relatifs à : class, surcharge, incompréhension.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR