Python 如何在请求中重写.get()方法?

Python 如何在请求中重写.get()方法?,python,overriding,python-requests,Python,Overriding,Python Requests,我希望requests中的.get()方法在get本身之外执行额外的操作: 打印出“hello world”(实际上这将是日志记录) 等待5秒钟,然后发出实际的GET(实际上,这将是一个更复杂的等待重试操作) 现在,我最简单的解决方案是使用一个实际调用requests.get()的函数: 但是我有一种强烈的感觉,那就是可以重写请求中的实际.get()方法 我以一种非常基本的方式使用对象编程,这将是一个实际学习覆盖部分的机会。关于如何重写和调用父类方法(这正是我想要做的:最终能够使用原始的.g

我希望
requests
中的
.get()
方法在
get
本身之外执行额外的操作:

  • 打印出“hello world”(实际上这将是日志记录)
  • 等待5秒钟,然后发出实际的
    GET
    (实际上,这将是一个更复杂的等待重试操作)
现在,我最简单的解决方案是使用一个实际调用
requests.get()
的函数:

但是我有一种强烈的感觉,那就是可以重写请求中的实际
.get()
方法

我以一种非常基本的方式使用对象编程,这将是一个实际学习覆盖部分的机会。关于如何重写和调用父类方法(这正是我想要做的:最终能够使用原始的
.get()
方法)有很多讨论

因此,我尝试了一种基本的覆盖:

import requests

class MyRequest(requests.Request):
    def get(self, url, **kwargs):
        print("hello world")
        # calling the parent .get() method to actually GET something
        super(MyRequest, self).get(url, **kwargs)

r = MyRequest.get('http://google.com')
此代码在以下情况下失败:

Traceback (most recent call last):
  File "C:/Users/yop/dev/infoscreen/testingrequestsclass.py", line 8, in <module>
    r = MyRequest.get('http://google.com')
TypeError: get() missing 1 required positional argument: 'url'
回溯(最近一次呼叫最后一次):
文件“C:/Users/yop/dev/infoscreen/testingrequestsclass.py”,第8行,在
r=MyRequest.get('http://google.com')
TypeError:get()缺少1个必需的位置参数:“url”
老实说,我被困在这里了。这些教程都是从父类的定义开始的,而我所拥有的是隐藏的(有)

,您可以覆盖它。它不是
请求上的方法。请求
模型:

import requests.api

def my_get(url, **kwargs):
    print('Hello World!')
    kwargs.setdefault('allow_redirects', True)
    return requests.api.request('get', url, **kwargs)

requests.api.get = my_get
然后使用一个新的会话对象来处理请求

与其替换
requests.get()
,我将提供
requests.Session()
对象的子类,覆盖,然后使用该会话对象的实例:

from requests import Session

class MySession(Session):
    def request(self, method, url, **kwargs):
        print('Hello World!')
        return super().request(method, url, **kwargs)
然后像这样使用:

with MySession() as session:
    response = session.get(url)

这样做的好处是,您还可以利用会话对象提供的完整功能集,另外,您的附加代码还可以用于POST、PUT、DELETE和HEAD等请求。

这是一个非常清楚的答案,谢谢。我将采用第二种方法,这种方法确实更加完整。然而,我得到了一个
AttributeError:'MySession'对象在运行它(在google.com上)时没有属性“decode”
错误,作为调用
out=string.decode(encoding)
的结果,在'File“C:\Python34\lib\site packages\requests\utils.py”,第690行,在to_native_string`.@WoJ:对不起,我的错误;我传入了
self
作为
super()
调用的第一个参数。现在删除。谢谢。如果有人到了那里,Python 2的调用将是
super()
调用
super(MySession,self)。request(method,url,**kwargs)
@WoJ:对,我假设您使用Python 3是因为您使用了
print()
作为函数。是的,我使用
print()
作为函数(并且系统地
.format())
(带命名参数),因为我觉得这更自然(可能是Python 3发生变化的原因之一)
with MySession() as session:
    response = session.get(url)