【问题标题】:Add function to module that doesn't have class instance向没有类实例的模块添加函数
【发布时间】:2018-08-16 00:09:09
【问题描述】:

我正在使用 requests 模块。我有许多程序想要对 requests.get(url) 调用的结果进行复杂的检查。我想也许我可以在继承自 requests 的某些部分的类中添加这个新函数。但是 get 调用是在一个 api.py 文件中,该文件只包含静态函数定义,没有类声明。所以我无法弄清楚我的导入或子类定义应该是什么样子("class Subclass(requests.api)" 不起作用。)

我想到的结局:

r = requests.get(url)
r.my_check()

有没有一种面向类的方法来完成这个,或者我应该在我自己的单独模块中编写一个函数,将 requests.get(url) 调用的结果传递给它,然后做完了吗?

【问题讨论】:

  • 感谢您提出有趣的问题。但是,这有点难以遵循。请将您想要完成的事情写成代码而不是简单的文本。再清楚一点,我相信您会得到所需的帮助。
  • @SteveJ:我想知道我能否最终得到:` r = requests.get(url) r.my_check() ` 其中 my_check 是新函数。
  • 我想你可能想多了。只需在您的my_check 函数中调用response = requests.get(...),或者先调用它并将结果传递给您的函数:my_check(response)

标签: python oop inheritance


【解决方案1】:

您可以定义自己的函数并在运行时附加到requests 模块。

def my_get(self, *args, **kwargs):
    original_get = self.get(args, kwargs)
    # do what you want with the original_get, maybe change it according to your needs, then return the changed response.
    return changed_get

requests.my_get = my_get

# now you can use both of them
requests.get(url) # regular get method
requests.my_get(url) # your own get method

【讨论】:

  • @Ramazon Polat 谢谢,但我并不是要更改现有的 get 函数,而是添加一个新函数。也许我对原始帖子的编辑使这一点更清楚。
  • 这个答案不会改变现有的get方法,而是添加一个名为my_get的新方法
  • @Ramazon Polat 啊,现在我明白你在做什么了。
  • 和@Alasdair:感谢cmets,但我不想在我的函数中“隐藏” get 调用(例如,有不止一种方法可以执行getrequests)。我将在一个单独的模块中编写一个函数。
【解决方案2】:

不是说这是一个好主意,但最终我认为你只是想动态地向 Response 对象添加一个方法?

import requests
from requests import Response

def my_method(self):
    print(self.content)

Response.my_method = my_method
r = requests.get('https://www.google.com')

r.my_method()

给...

b'<!doctype html><html itemscope="" itemtype="http://schema.org/WebPage" lang="en"><head><me

【讨论】:

  • 是的,我正在寻找添加方法的通用解决方案。我习惯于在 .Net 中执行此操作(继承类并添加方法)。这在 Python 中不常见的原因是什么?
猜你喜欢
  • 2021-12-01
  • 2021-09-17
  • 2018-01-16
  • 2023-03-15
  • 2012-01-27
  • 2012-04-29
  • 2021-05-14
  • 2018-06-30
  • 2023-03-22
相关资源
最近更新 更多