Python继承requests.Session类访问proxies触发AttributeError错误
错误产生原因
- 你定义的
requests_session函数返回值是RequestsSession类本身,而非该类的实例对象。你代码中把self.proxies定义在__init__方法内,属于实例属性,只有类完成实例化后才会绑定到实例对象上,直接通过类对象访问实例属性必然会触发属性不存在的报错。 - 额外的错误点:你尝试访问
extra_headers.__init__.proxies的写法本身不符合语法规则,__init__是类的构造方法,本身不会携带proxies属性,不需要对__init__方法做属性读取。
修复方案
有两种常见的修复思路,按需选择即可:
方案1:修改工厂函数直接返回实例(更推荐)
修改test.py里的requests_session函数,实例化类之后再返回,这样调用侧直接拿到可用的实例对象:
# test.py 修改后代码 import requests def requests_session(proxies): class RequestsSession(requests.Session): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.trust_env = False self.proxies = proxies # 新增实例化步骤,返回实例而非类 return RequestsSession()
此时proxy.py的调用代码无需修改,直接运行即可正常读取proxies属性。
方案2:调用侧先对返回的类做实例化
如果需要保留工厂函数返回类的逻辑,就在proxy.py调用时加括号完成实例化:
# proxy.py 修改后代码 from test import requests_session proxies = {'http': 'http://proxy:8080', 'https': 'http://proxy:8080'} # 加括号完成类的实例化,实例才会绑定proxies属性 extra_headers = requests_session(proxies)() # 直接访问实例的proxies属性即可,不需要访问__init__ print(extra_headers.proxies)
内容的提问来源于stack exchange,提问作者Reactive_learner
相关产品推荐
相关产品推荐

