monkey patch mit einem egg
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? danke robert
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
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@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
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 robert rottermann wrote:
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.
Was 'egg' mit Monkeypatching zu tun. Monkeypatching hat nichts damit zu tun wie ein Package deployed wurde.
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
Die zu überschreibende Methode ist __adjust_bound_col_idx()???
jedoch wird weiterhin die ursprüngliche methode genutzt.
Schwer zu glauben. Monkeypatching
wenn ich im debugger die Klasse untersuche, hat sie zwei Methoden mit dem Namen __adjust_bound_col_idx.
Ein Klasse kann keine zwei Methoden mit gleichen Namen haben - absolut unmöglich. Wahrscheinlich lügt Dir WingIDE irgendwas vor (wie so oft).
Jedenfalls behaupted das die codeinspection von Wing4.
s.o.
Ist es möglich, dass "semiprivate" methoden die mit __ beginnen nicht gepatcht werden können?
Es gibt keine semiprivaten Methoden oder privaten Methoden - eine Methode ist eine Methode ist eine Methode...alles mit "privat" ist reine Festlegungssache ohne Python-interne Bedeutung. - -aj - -- ZOPYX Limited | zopyx group Charlottenstr. 37/1 | The full-service network for Zope & Plone D-72070 Tübingen | Produce & Publish www.zopyx.com | www.produce-and-publish.com - ------------------------------------------------------------------------ E-Publishing, Python, Zope & Plone development, Consulting -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (Darwin) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iQGUBAEBAgAGBQJNkEGeAAoJEADcfz7u4AZjT+sLvA9tPC4pPiGS+ylj/3C4UJa0 J16FJtBohmYozGKtq++k+zro4jYMH9kCKUcAUjFCeGM7izX4VZJrQky5uHNlFOyj gE4gmrSYI0EWTIsJbUwfMX2vPtgFdzFy08dVLqImACr0lOaFvxf120cXWP9I/h4J 0lKxOFeOTQ4t3q3o/JrZyC38D5cgVukCP+EiUHK866X/1xsHGHJrKoWWWMoL9XKC JKqwcluV8p8fpv7LTzjcL5YWtvoZ01/NcuhmjuN8l7uM/UWp5spRbjakPTn+OVyk NtBmw4m/83LsooGLkACIuwNmUQJZkcvWjsIgeSfHis9Wp6BtAu4L4Gz13gX6ftBV DrzyPSDBEWxywQcRIvW+P02Bhfti+SjMLurbDRO+hfBmAuJlKrjASxCnf4rhLcrH tdIhZW8SwfuFlfKsX/ak8VGFXXPUZ+YujUNntxFL1nEOM9mubAs5Qi6tAvYJ7OVA cXVVH4/wzs49px0wjRoutZfDMa+Opho= =N3Je -----END PGP SIGNATURE-----
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@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
participants (3)
-
Andreas Jung
-
Diez B. Roggisch
-
robert rottermann