[Python-de] gelöst Re: monkey patch mit einem egg

robert rottermann robert at redcor.ch
Mo Mär 28 08:47:59 UTC 2011


Am 28.03.2011 09:32, schrieb robert rottermann:
> 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 ?
>
ja ich musste Diez Information nur konsequenter anwenden.
Auch die "privaten" Variabeln werden gemangelt.

Folgendermassen funktionierts:
     # 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._Row__parent
             if iarg < self._Row__min_col_idx:
                 self._Row__min_col_idx = iarg
             if iarg > self._Row__max_col_idx:
                 self._Row__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

mehr dazu fand ich unter:
http://docs.python.org/tutorial/classes.html unter


    9.6. Private Variables


danke nochmals
robert

-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <http://python.net/pipermail/python-de/attachments/20110328/0c532b55/attachment.htm>


Mehr Informationen über die Mailingliste python-de