如何在python中包装基类方法



使用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()

最新更新