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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 15:36:04