我有一个名为Client
的类,它使用requests
模块与服务进行交互。它具有如下方法:
def get_resource(self, url, headers):
response = requests.get(url, headers, auth=self.auth)
return response
现在,我想在每次调用请求模块之前和之后调用一些方法。像这样:
def get_resource(self, url, headers):
self.add_request_header(headers)
response = requests.get(url, headers, auth=self.auth)
self.process_response_headers()
return response
我很难找到一种无需重写所有Client
方法的方法。最直接的方法是将对请求模块的调用更改为对self的调用,并将调用添加到此处的方法。
def get_resource(self, url, headers):
response = self.__get(url, headers, auth=self.auth)
return response
def __get(self, headers, auth):
self.add_request_header(headers)
response = requests.get(url, headers, auth=self.auth)
self.process_response_headers()
return response
但是,这需要我更改所有呼叫站点和请求模块的重复功能。我尝试使用装饰器将这些方法调用添加到请求模块功能,但对如何将自身传递给装饰器感到困惑。
我确定在Python中有一种优雅的方法。
答案 0 :(得分:0)
您可以使用猴子修补程序。 阅读:Python: Monkeypatching a method of an object
import requests
def get(self, url, params=None, **kwargs):
self.add_request_header(self.headers)
response = requests.get(url, self.headers, auth=self.auth)
self.process_response_headers()
setattr(requests.Session, 'get', requests.Session.get)
s = requests.Session()
答案 1 :(得分:0)
我认为在这种情况下,装饰器将不像听起来那样好,并且OOP是解决您的问题的更好方法。您可以使用基类Client:
class Client(object):
def __init__(self, auth):
self.auth = auth
def add_request_header(self, headers):
pass
def process_response_headers(self):
pass
def get_resource(self, url, headers):
self.add_request_header(headers)
response = requests.get(url, headers, auth=self.auth)
self.process_response_headers()
return response
并使用add_request_header
和/或process_response_headers
的其他实现创建另一个子类,以便稍后只需要实例化更适合您的情况的类