Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Hi,
weiß jemand wie ich um ein existierendes objekt ein wrapper objekt drumherum legen kann?
Was ich konkret machen will ist den zugriff auf ein object mit einer reihe von (unbekannten) methoden zu kontrollieren (wegen threading.Lock() und so).
class KlasseMitNichtBekanntenMethoden():
def EineMethode(self):
pass
def EineAndereMethode(self, args):
return args
class Wrapper():
__init__(self, object):
self.object = object
#keine ahnung was zu tun ist
MethodeAufrufen(self, methodenName, args):
#tue das was ich will
self.result = self.object.methodenName(args)
#tue wieder was ich will
return self.result
x = KlasseMitNichtBekanntenMethoden()
y = Wrapper(x)
ergebnis = y.EineAndereMethode(10)
ich hoffe man versteht was ich meine^^
schon ma vielen dank im voraus für eure hilfe
mfg thomaz
import functools
class KlasseMitNichtBekanntenMethoden():
def EineMethode(self):
pass
def EineAndereMethode(self, args):
print "EineAndereMethode", args
return args
class Wrapper():
def __init__(self, obj):
self.obj = obj
#keine ahnung was zu tun ist
def __getattr__(self, key):
m = getattr(self.obj, key)
if callable(m):
return functools.partial(self.MethodeAufrufen, m)
else:
return m
def MethodeAufrufen(self, methode, *args, **kwargs):
#tue das was ich will
self.result = methode(*args, **kwargs)
#tue wieder was ich will
return self.result
x = KlasseMitNichtBekanntenMethoden()
y = Wrapper(x)
ergebnis = y.EineAndereMethode(10)
danke für die schnellen antworten
is genau das was ich gesucht habe
und des mit den andere attribute, die "callable" sind macht auch nix. is perfekt, genau das was ich gebraucht habe.
hätte ich nie selbst hinbekommen
danke
from types import MethodType
class Wrapper(object):
def __init__(self, obj):
self.obj = obj
def __getattr__(self, name):
m = getattr(self.obj, name)
if isinstance(m, MethodType):
return m
raise AttributeError("No method named %s found." % name)
# Python > 2.6 "No method names {0} found.".format(name)
__getattr__ wird nur dann aufgerufen, wenn ein Attribut nicht auf durch die normale "Lookup"-Hierarchie gefunden wird (Exemplar, dessen Klasse, deren Superklassen). Komplete Wrapper brauchen nur getattr() auf self.obj benutzen.