Python类报错AttributeError: 'str' object has no attribute 'fd'如何解决
报错原因
- 类加载阶段会直接执行类定义内的顶层代码,你在类定义中直接调用实例方法
fundamental("Exchange"),此时还没有创建DATA类的实例,实例方法要求的第一个参数self没有被自动注入,你传入的字符串"Exchange"会被当成self参数传入方法,因此方法内调用self.fd时才会抛出str对象没有fd属性的错误。 fundamental方法依赖的self.ticker是实例属性,只有创建实例时才会被赋值,类加载阶段不存在该值,就算self的问题解决,也无法拿到正确的请求参数。- 把
api_key、ts、fd、fo这些变量定义为类属性,多实例场景下如果有修改操作会引发共享变量冲突,不符合封装逻辑。
修复方案
将工具对象初始化、exchange和currency属性的赋值逻辑放到实例构造方法__init__中,在实例创建完成后再执行相关调用,修复后的代码如下:
import os from alpha_vantage.timeseries import TimeSeries from alpha_vantage.fundamentaldata import FundamentalData from alpha_vantage.foreignexchange import ForeignExchange class DATA: # 固定不变的API Key可作为类常量存放 ALPHAVANTAGE_API_KEY = os.getenv("ALPHAVANTAGE_API_KEY") def __init__(self, name, ticker): self.name = name self.ticker = ticker # 实例初始化时创建Alpha Vantage对应的工具对象 self.ts = TimeSeries(key=self.ALPHAVANTAGE_API_KEY, output_format="pandas") self.fd = FundamentalData(key=self.ALPHAVANTAGE_API_KEY, output_format="pandas") self.fo = ForeignExchange(key=self.ALPHAVANTAGE_API_KEY, output_format="pandas") # 实例属性初始化完成后调用方法获取对应基本面值 self.exchange = self.fundamental("Exchange") self.currency = self.fundamental("Currency") def fundamental(self, category="Name"): """ 工具方法:根据分类获取基本面数据 :param category: Alpha Vantage分类名称,字符串类型 :return: 选中的基本面数据值 """ fundamental_data = self.fd.get_company_overview(symbol=self.ticker) fun_data = fundamental_data[0] fun_data = fun_data[category].values[0] return fun_data
使用示例:
# 实例化对象即可自动拉取对应数据 apple_data = DATA(name="苹果公司", ticker="AAPL") print(apple_data.exchange) print(apple_data.currency)
注意事项:
- 需提前在运行环境中正确配置
ALPHAVANTAGE_API_KEY环境变量,否则API调用会失败 - Alpha Vantage免费版有调用频率限制,批量创建实例时需要控制调用间隔,避免被限流
内容的提问来源于stack exchange,提问作者user16573292
相关产品推荐
相关产品推荐

