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'
Oui, ça va fonctionner. Avez-vous des problèmes avec cette approche? –
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. –
Quels sont les avantages de cette méthode par rapport à la sous-classe et à la substitution de la méthode '__init__'? – dm03514