Python 代理 class
Python proxy class
我正在尝试为另一个 class 创建代理 class。我希望将此 class 传递到其构造函数中的代理,然后让代理在其自身上动态创建此 class 的所有相同方法。
这是我目前使用的方法,但没有用:
import inspect
from optparse import OptionParser
class MyClass:
def func1(self):
print 'MyClass.func1'
def func2(self):
print 'MyClass.func1'
class ProxyClass:
def __init__(self):
myClass = MyClass()
members = inspect.getmembers(MyClass, predicate=inspect.ismethod)
for member in members:
funcName = member[0]
def fn(self):
print 'ProxyClass.' + funcName
return myClass[funcName]()
self.__dict__[funcName] = fn
proxyClass = ProxyClass()
proxyClass.func1()
proxyClass.func2()
我认为需要更改的是 self.__dict__[funcName] = fn
行,但我不确定要更改什么?
我是 Python 的新手,所以如果有完全不同的 Pythonic 方法来做这件事,我也很乐意听到。
我不会明确复制包装的方法 class。您可以使用魔术方法 __getattr__
来控制在代理对象上调用某些内容时发生的情况,包括根据需要对其进行装饰; __getattr__
必须 return 一个可调用对象,因此您可以使该可调用对象做任何您需要的事情(除了调用原始方法)。
我在下面包含了一个示例。
class A:
def foo(self): return 42
def bar(self, n): return n + 5
def baz(self, m, n): return m ** n
class Proxy:
def __init__(self, proxied_object):
self.__proxied = proxied_object
def __getattr__(self, attr):
def wrapped_method(*args, **kwargs):
print("The method {} is executing.".format(attr))
result = getattr(self.__proxied, attr)(*args, **kwargs)
print("The result was {}.".format(result))
return result
return wrapped_method
proxy = Proxy(A())
proxy.foo()
proxy.bar(10)
proxy.baz(2, 10)
我正在尝试为另一个 class 创建代理 class。我希望将此 class 传递到其构造函数中的代理,然后让代理在其自身上动态创建此 class 的所有相同方法。
这是我目前使用的方法,但没有用:
import inspect
from optparse import OptionParser
class MyClass:
def func1(self):
print 'MyClass.func1'
def func2(self):
print 'MyClass.func1'
class ProxyClass:
def __init__(self):
myClass = MyClass()
members = inspect.getmembers(MyClass, predicate=inspect.ismethod)
for member in members:
funcName = member[0]
def fn(self):
print 'ProxyClass.' + funcName
return myClass[funcName]()
self.__dict__[funcName] = fn
proxyClass = ProxyClass()
proxyClass.func1()
proxyClass.func2()
我认为需要更改的是 self.__dict__[funcName] = fn
行,但我不确定要更改什么?
我是 Python 的新手,所以如果有完全不同的 Pythonic 方法来做这件事,我也很乐意听到。
我不会明确复制包装的方法 class。您可以使用魔术方法 __getattr__
来控制在代理对象上调用某些内容时发生的情况,包括根据需要对其进行装饰; __getattr__
必须 return 一个可调用对象,因此您可以使该可调用对象做任何您需要的事情(除了调用原始方法)。
我在下面包含了一个示例。
class A:
def foo(self): return 42
def bar(self, n): return n + 5
def baz(self, m, n): return m ** n
class Proxy:
def __init__(self, proxied_object):
self.__proxied = proxied_object
def __getattr__(self, attr):
def wrapped_method(*args, **kwargs):
print("The method {} is executing.".format(attr))
result = getattr(self.__proxied, attr)(*args, **kwargs)
print("The result was {}.".format(result))
return result
return wrapped_method
proxy = Proxy(A())
proxy.foo()
proxy.bar(10)
proxy.baz(2, 10)