使用python3时,我有以下类
class RESTApi:
def __init__(self):
self.connection = # Create connection
def hello_world(self):
print("Hello World !!")
... # More methods
class BaseVM:
def __init__(self):
self.restapi = RESTApi()
def _refresh_restapi_connection(self):
self.restapi = # Reconnect
class MyClass(BaseVM):
def __init__(self, *args):
BaseVM.__init__(self, *args)
def create_user(self, usr, pwd):
self.restapi.create_user(usr, pwd)
MyClass是我与现有类交互的地方,我可以在MyClass中更改代码,但不能在其他类中更改。
我遇到的问题是REST连接在空闲时被清理掉。因此,每当"self.restapi.XYZ"失败时,我需要实现一个刷新REST连接的调用(_refresh_restapi_connection(。
我希望这能在尝试中自动完成。。。除了像"create_user"等方法不需要知道是否存在重新连接。
由于我无法更改其他类,我正在尝试在self.restapi
调用上创建一个包装器
某种类型的东西:
class RestRetry:
'''
Wrapper over RESTApi class instance with retries
'''
def __init__(self, vm):
self._restapi = vm.restapi
def __getattr__(self, attrb):
return self.rest_retry(attrb)
def rest_retry(self, attrb):
def _retry():
try:
# class REST API with retries
result = getattr(self._restapi, attrb)
except:
self._refresh_restapi_connection()
return getattr(self._restapi, attrb)
else:
return result
return _retry
然后MyClass
将具有
def __init__(self, *args):
BaseVM.__init__(self, *args)
self.restapi = RestRetry()
但它不起作用
也许我错过了一些非常基本的东西,也许我试图用错误的方式解决这个问题。
这就是我最终写的内容。不得不更改MyClass
中的属性名称,我不想这样做,但如果没有,它就无法工作
class RestRetry:
'''
Wrapper over RESTApi class instance with retries
'''
def __init__(self, vm):
self._vm= vm
def __getattr__(self, attrb):
return self.rest_retry(attrb)
def rest_retry(self, attrb):
def _retry(*args, **kwargs):
try:
# class REST API with retries though
result = getattr(self._vm.restapi, attrb)(*args, **kwargs)
except:
self._vm._refresh_restapi_connection()
return getattr(self._vm.restapi, attrb)(*args, **kwargs)
else:
return result
return _retry
然后在MyClass
中
def __init__(self):
BaseVM.__init__(self)
self._restapi = self.RestRetry(self)
def any_method(self):
self._restapi.hello_world()