You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中schedule与requests库无法配合自定义类使用的问题排查

问题分析与解决方案

嘿,我来帮你理清楚这两个写法的问题,以及怎么修正它们!

先看你的两个写法为什么不对

  • 写法一的问题:你把Bot类直接传给了schedule.do(),schedule每次执行时确实会创建一个Bot实例,但这个操作本身不会触发任何数据获取逻辑——你只是实例化了类,却没有调用fetchCurrenciesData方法!而且实例化类本身不会产生输出,所以程序看起来毫无反应。

  • 写法二的问题:impactBot()是试图调用这个Bot实例,但你的Bot类没有定义__call__方法,Python自然会报错“Bot object is not callable”。更关键的是,schedule.do()需要接收可调用对象(比如函数、类的方法),而你这里传的是impactBot()执行后的返回值(也就是None,因为__init__没有返回值),完全不符合schedule的要求。

正确的写法

你需要把Bot实例的fetchCurrenciesData方法传给schedule.do(),同时别忘了在方法里添加输出逻辑(比如打印数据),不然就算执行了也看不到结果。

修正后的完整代码:

import requests
import time
import schedule

class Bot:
    def __init__(self):
        self.url = 'https://www.website.com'
        self.params = { ... }  # 替换成你的实际参数
        self.headers = { ... }  # 替换成你的实际请求头
        self.orders = []
    
    def fetchCurrenciesData(self):
        try:
            r = requests.get(url=self.url, headers=self.headers, params=self.params).json()
            data = r['data']
            print("成功获取数据:", data)  # 添加打印,才能看到输出
            return data
        except Exception as e:
            print("获取数据出错:", str(e))  # 加上异常捕获,方便排查问题

# 实例化Bot类
impactBot = Bot()
# 将实例的方法传给schedule.do(),注意不要加括号!加括号会直接执行方法而不是传入可调用对象
schedule.every(5).seconds.do(impactBot.fetchCurrenciesData)

while True:
    schedule.run_pending()
    time.sleep(1)

额外小提示

如果你的fetchCurrenciesData需要传参数,可以用do方法的args或kwargs参数,比如:

schedule.every(5).seconds.do(impactBot.fetchCurrenciesData, param1="value1", param2="value2")

内容的提问来源于stack exchange,提问作者User 147

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 07:43:12