[Python-de] monkey patch mit einem egg

robert rottermann robert at redcor.ch
Mo Mär 28 07:32:54 UTC 2011


Am 27.03.2011 13:37, schrieb Diez B. Roggisch:
>
> Am 27.03.2011 um 12:14 schrieb robert rottermann:
>
>> Hoi zäme,
>>
>> ich versuche eine methode einer Klasse die aus einem egg stamm mit einem 
>> monkey pach anzupassen.
>>
>> das gelingt aber nicht.
>> Python ist Version 2.4
>>
>> was ich mache ist folgendes:
>> from xlwt import *
>> def adjust_bound_col_idx(self, *args(...)
>>    meine Anpassungen
>>    ..
>> Row.__adjust_bound_col_idx = adjust_bound_col_idx
>>
>> jedoch wird weiterhin die ursprüngliche methode genutzt.
>>
>> wenn ich im debugger die Klasse untersuche, hat sie zwei Methoden mit dem 
>> Namen __adjust_bound_col_idx.
>> Jedenfalls behaupted das die codeinspection von Wing4.
>>
>> Ist es möglich, dass "semiprivate" methoden die mit __ beginnen nicht 
>> gepatcht werden können?
>
> Doch, bestimmt. Du musst nur den gescopten (scheiss wort) Namen benutzen:
>
>
>
> class Foo(object):
>
>
>     def invoke(self):
>         self.__protected()
>
>
>     def __protected(self):
>         print "original"
>
>
> f = Foo()
> f.invoke()
>
>
> def fake(self):
>     print "fake"
>
> Foo._Foo__protected = fake
>
> f.invoke()
>
>
> Diez
> _______________________________________________
> python-de maillist  -  python-de at python.net
> http://python.net/mailman/listinfo/python-de
Diez besten dank,
mit dem komm ich ein Stück weiter. Meine Methode wird nun aufgerufen. Und schon 
kommt das nächste Problem.
Die Methode greift auf private Klassenvariabeln zu. Und Python behauptet 
stinkfrech, die gäbe es nicht:

     # monkey patch possible colindex > 256
     def adjust_bound_col_idx(self, *args):
         for arg in args:
             iarg = int(arg)
             if not ((0 <= iarg <= 1023) and arg == iarg):
                 raise ValueError("column index (%r) not an int in range(1024)" 
% arg)
             sheet = self.__parent <------------------ hier tritt der Fehler auf
             if iarg < self.__min_col_idx:
                 self.__min_col_idx = iarg
             if iarg > self.__max_col_idx:
                 self.__max_col_idx = iarg
             if iarg < sheet.first_used_col:
                 sheet.first_used_col = iarg
             if iarg > sheet.last_used_col:
                 sheet.last_used_col = iarg
     Row._Row__adjust_bound_col_idx = adjust_bound_col_idx

AttributeError: 'Row' object has no attribute '__parent'

ich vermute das liegt auch am verwursten der Variabeln.
Wie muss ich das machen ?

danke
robert



Mehr Informationen über die Mailingliste python-de