gpt4 book ai didi

.net - IronPython 中的代理对象

转载 作者:太空宇宙 更新时间:2023-11-04 11:06:11 25 4
gpt4 key购买 nike

我正在尝试在 IronPython 中创建一个代理对象,它应该动态呈现底层结构。代理本身不应该有任何功能和属性,我试图在运行时捕获所有调用。捕获函数调用很容易,我只需要为我的对象定义 getattr() 函数,检查底层是否存在适当的函数,并返回一些类似函数的对象。

我在属性方面遇到问题 - 我不知道如何区分调用上下文,我的属性是左值还是右值:

o = myproxy.myproperty # 我需要调用 underlying.myproperty_get()

myproxy.myproperty = o # 我需要调用 underlying.myproperty_set(o)

我查看了 Python 中的特殊函数列表,但没有找到合适的。

我还尝试通过 exec() 和内置 property() 函数的组合动态地在对象中创建属性,但我发现 IronPython 1.1.2 缺少整个"new"模块(IronPython 中存在2.x beta,但我宁愿使用 IP 1.x,因为有 .NET 2.0 框架)。

有什么想法吗?

最佳答案

你想要在 python 中实现的通常是这样的:

class CallProxy(object):
'this class wraps a callable in an object'
def __init__(self, fun):
self.fun = fun

def __call__(self, *args, **kwargs):
return self.fun(*args, **kwargs)

class ObjProxy(object):
''' a proxy object intercepting attribute access
'''
def __init__(self, obj):
self.__dict__['_ObjProxy__obj'] = obj

def __getattr__(self, name):
attr = getattr(self.__obj, name)
if callable(attr):
return CallProxy(attr)
else:
return attr

def __setattr__(self, name, value):
setattr(self.__obj, name, value)

我写了一个测试来证明它的行为符合预期:

#keep a list of calls to the TestObj for verification
call_log = list()
class TestObj(object):
''' test object on which to prove
that the proxy implementation is correct
'''
def __init__(self):
#example attribute
self.a = 1
self._c = 3

def b(self):
'example method'
call_log.append('b')
return 2

def get_c(self):
call_log.append('get_c')
return self._c
def set_c(self, value):
call_log.append('set_c')
self._c = value
c = property(get_c, set_c, 'example property')

def verify(obj, a_val, b_val, c_val):
'testing of the usual object semantics'
assert obj.a == a_val
obj.a = a_val + 1
assert obj.a == a_val + 1
assert obj.b() == b_val
assert call_log[-1] == 'b'
assert obj.c == c_val
assert call_log[-1] == 'get_c'
obj.c = c_val + 1
assert call_log[-1] == 'set_c'
assert obj.c == c_val + 1

def test():
test = TestObj()
proxy = ObjProxy(test)
#check validity of the test
verify(test, 1, 2, 3)
#check proxy equivalent behavior
verify(proxy, 2, 2, 4)
#check that change is in the original object
verify(test, 3, 2, 5)

if __name__ == '__main__':
test()

这在 CPython 上执行,没有任何断言抛出异常。 IronPython 应该是等效的,否则它会被破坏并且应该将此测试添加到它的单元测试套件中。

关于.net - IronPython 中的代理对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/340093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com