Python猴子修补

use*_*375 9 python monkeypatching

我需要monkeypatch请求的Response类(版本1.0.4,此问题的当前版本),以添加其他方法.

我有这个代码:

import requests

class Response(requests.models.Response):
    def hmm(self):
        return 'ok'

requests.models.Response = Response

r = requests.get('http://bbc.co.uk')

print r
Run Code Online (Sandbox Code Playgroud)

原始响应调用super()时失败 - https://github.com/kennethreitz/requests/blob/master/requests/models.py#L391

我认为这是因为它变得困惑,因为我已经取代了课程,我觉得我在做一些愚蠢的事情,任何想法?提前致谢.

Mar*_*ers 12

只需将函数直接添加到类中,您最好:

def hmm(self):
    return 'ok'
requests.models.Response.hmm = hmm
Run Code Online (Sandbox Code Playgroud)

这很好用:

>>> import requests
>>> def hmm(self):
...     return 'ok'
... 
>>> requests.models.Response.hmm = hmm
>>> r = requests.get('http://bbc.co.uk')
>>> print r
<Response [200]>
>>> r.hmm()
'ok'
>>> requests.__version__
'1.0.4'
Run Code Online (Sandbox Code Playgroud)


pok*_*oke 5

我不认为你可以像那样修补那种类型。导入时requests,所有这些模块都被初始化。并且随着整个库from xy import Request反复使用,它将具有对实际类型的精确引用。只有在此之后,您才替换模型模块中的响应类型,因此只有后续导入会受到影响。

除非您浏览所有模块并用您的新类型手动替换它们的 Response 引用,否则它们仍将使用原始类型,从而使您的补丁无用。

相反,您应该保留原始类型但直接扩展它,正如 Martijn 建议的那样。