gpt4 book ai didi

python - Python 中的代理模式

转载 作者:行者123 更新时间:2023-11-28 20:25:25 24 4
gpt4 key购买 nike

我的代码中实现了很多类。现在我意识到,对于为所有这些类调用的每个方法,我需要添加一行:

with service as object:

所以我尝试使用代理模式来自动完成这项工作,这是我的示例代码

class A(object):
def __init__(self, name):
self.name = name
def hello(self):
print 'hello %s!' % (self.name)
def __enter__(self):
print 'Enter the function'
return self
def __exit__(self, exc_type, exc_value, traceback):
print 'Exit the function'
class Proxy(object):
def __init__(self, object_a):
# object.__setattr__(self, '_object_a', object_a)
self._object_a = object_a

def __getattribute__(self, name):
service = object.__getattribute__(self, '_object_a')
with service as service:
result = getattr(service, name)
return result

if __name__=='__main__':
a1 = A('A1')
b = Proxy(a1)
b.hello()
a2 = A('A2')
b = Proxy(a2)
b.hello()

一切正常,我有输出:

Enter the function A1
Exit the function A1
hello A1!
Enter the function A2
Exit the function A2
hello A2!

但这并不是我真正需要的,因为我需要的是:

with a1 as a1:
a1.hello()

我必须有输出:

Enter the function A1
hello A1!
Exit the function A1
Enter the function A2
hello A2!
Exit the function A2

我需要什么才能得到那个结果?谢谢

最佳答案

我会使用装饰器:

class Proxy(object):
def __init__(self, object_a):
self._object_a = object_a

def decorateEnterExit(self, obj, f):
def inner(*args, **kwargs):
with obj as _:
return f(*args, **kwargs)
return inner

def __getattribute__(self, name):
obj = object.__getattribute__(self, '_object_a')
dee = object.__getattribute__(self, 'decorateEnterExit')
return dee(obj, getattr(obj, name))

这样,只有在执行函数时才会计算 with 。按照您执行此操作的方式,它将首先评估 with(包括退出它),然后 function 将被返回以供调用。现在我们返回一个函数,它本身将进入 with 并调用里面的函数。

>>> Proxy(A('Ax')).hello()
Enter the function
hello Ax!
Exit the function

请注意,您需要在A__enter__ 方法中返回self:

def __enter__(self):
print 'Enter the function'
return self

关于python - Python 中的代理模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15269774/

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