Python OOP组合应用报错:CalculaVariaciones类无retornos_diarios属性
错误根源
你报错的直接原因是实例化DibujaHistograma时传参错误:
你写的是histograma = DibujaHistograma(CalculaVariaciones),这里把CalculaVariaciones类本身传进去了,而不是你之前已经初始化、运行过计算方法的实例calcula_variaciones。retornos_diarios是类的实例属性,只有实例化后的对象才会生成该属性,类本身不会携带这个属性,因此抛出找不到属性的错误。
另外你的代码还有一处隐藏错误:CalculaVariaciones类的calc_log_retornos_diarios方法中,self.df_yahoo.retornos_diarios属于属性调用错误,df_yahoo是ImportaYahoo的实例,不存在retornos_diarios属性,该属性属于CalculaVariaciones自身的实例属性,调用时需要调整。
组合模式的正确用法说明
你当前的设计思路已经符合组合的核心逻辑:不通过继承复用代码,而是把不同功能的类实例作为属性传入当前类,实现功能拼接。正确的组合用法要点:
- 被依赖的功能模块先完成初始化、执行完必要的方法得到计算结果
- 把已经就绪的实例传入依赖它的类,而不是传入类本身
- 组合类只需要调用传入实例的属性和方法完成自己的逻辑,不需要继承被依赖类的任何属性和方法
修正后可运行的完整代码
import os import pandas as pd import datetime as dt import numpy as np import matplotlib.pyplot as plt import yfinance class ImportaYahoo: def __init__(self): self.df_apple = pd.DataFrame({}) self.apple_close = pd.DataFrame({}) def importar_cotizaciones(self): # 导入Apple的行情数据 name = 'AAPL' ticker = yfinance.Ticker(name) self.df_apple = ticker.history(interval="1d",start="2017-01-4",end="2021-04-10") self.apple_close = self.df_apple[["Close"]] class CalculaVariaciones: def __init__(self, importar_yahoo): self.df_yahoo = importar_yahoo # 组合ImportaYahoo实例 self.retornos_diarios = pd.DataFrame({}) self.log_retornos_diarios = pd.DataFrame({}) def calc_retornos_diarios(self): # 计算日涨跌幅 self.retornos_diarios = self.df_yahoo.apple_close.pct_change() self.retornos_diarios.fillna(0, inplace=True) self.retornos_diarios.dropna(inplace = True) def calc_log_retornos_diarios(self): # 修复属性调用错误 self.log_retornos_diarios = np.log(self.retornos_diarios + 1) class DibujaHistograma(): def __init__(self, calcula_variaciones): self.variaciones = calcula_variaciones # 组合CalculaVariaciones实例 def mostrar_histograma(self): # 绘制直方图 print("\n*******************************************************") self.variaciones.retornos_diarios.hist(bins = 100, color='blue', figsize=(15, 8)) plt.ylabel('Frecuencia') plt.xlabel('Retornos diarios') plt.title('Histograma de los retornos diarios') plt.show() # 按依赖顺序实例化、执行逻辑 importar_yahoo = ImportaYahoo() importar_yahoo.importar_cotizaciones() calcula_variaciones = CalculaVariaciones(importar_yahoo) calcula_variaciones.calc_retornos_diarios() calcula_variaciones.calc_log_retornos_diarios() # 修复传参错误:传入已经计算完成的实例 histograma = DibujaHistograma(calcula_variaciones) histograma.mostrar_histograma()
内容的提问来源于stack exchange,提问作者efueyo
相关产品推荐
相关产品推荐

