2013-03-15 2 views
0

J'ai une classe d'une bibliothèque et je veux modifier le comportement du constructeur.redefine __init__

que je fais:

from library import TheClass 

TheClass._original_init = TheClass.__init__ 

def f(self, *karg, **kargw): 
    print "hello" 
    self._original_init(*karg, **kargw) 

TheClass.__init__ = f 

est-ce la bonne approche? J'ai un problème dans ce cas précis:

import matplotlib.pyplot as plt 
from matplotlib import axes 
from matplotlib.ticker import MultipleLocator 

axes.Subplot._original_init = axes.Subplot.__init__ 

def f(self, *karg, **kargw): 
    def add_minor_locator(axis, n = 5): 
     ticklocs = axis.get_ticklocs() 
     diff = ticklocs[1] - ticklocs[0] 
     minorLocator = MultipleLocator(diff/float(n)) 
     axis.set_minor_locator(minorLocator) 
    add_minor_locator(self.get_xaxis()) 
    add_minor_locator(self.get_yaxis()) 

    self._original_init(*karg, **kargw) 

axes.Subplot.__init__ = f 

fig, ax = plt.subplots(nrows=1, ncols=1) 

Je reçois:

File "/usr/lib64/python2.7/site-packages/matplotlib/axes.py", line 1319, in get_xaxis 
    return self.xaxis 
AttributeError: 'AxesSubplot' object has no attribute 'xaxis' 
+0

Oui, ça va fonctionner. Avez-vous des problèmes avec cette approche? –

+0

Je préférerais hériter de la classe d'origine que de la corriger avec un singe, sauf si vous avez une bonne raison de le faire. –

+1

Quels sont les avantages de cette méthode par rapport à la sous-classe et à la substitution de la méthode '__init__'? – dm03514

Répondre

2

Vous présumez que l'__init__ d'origine a déjà couru; self.get_xaxis() ne doit être appelée après initialisation a eu lieu:

def f(self, *karg, **kargw): 
    _original_init(self, *karg, **kargw) 

    def add_minor_locator(axis, n = 5): 
     ticklocs = axis.get_ticklocs() 
     diff = ticklocs[1] - ticklocs[0] 
     minorLocator = MultipleLocator(diff/float(n)) 
     axis.set_minor_locator(minorLocator) 
    add_minor_locator(self.get_xaxis()) 
    add_minor_locator(self.get_yaxis()) 
+0

vous avez raison, mais maintenant j'ai une autre erreur: 'raise RuntimeError ('Locator essayant de générer% d ticks de% s à% s: excède Locator.MAXTICKS'% (len (locs), locs [0], locs [ -1])) RuntimeError: Locator essayant de générer 87501 ticks de 0.0 à 3500.0: excède Locator.MAXTICKS' –

+0

@wiso: c'est parce que vous êtes des valeurs sur le locator qui sont hors des limites. C'est un problème avec votre code 'add_minor_locator()', pas avec la façon dont vous avez patché la classe. Votre patch fonctionne autrement. –

+0

y a-t-il une solution? –