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

如何修改类属性默认值?Python类属性循环赋值问题求助

解决方案:动态修改Strategy的short_window和long_window属性

我来帮你搞定这个问题!先分析下你代码里的核心问题:你的test类在初始化时要求传入Strategy类,但你却传了一个已经实例化好的Strategy对象(strategy(data, 2,3 )),更关键的是,test类内部的_generate_instances方法会用传入的类重新实例化一次(用默认参数),直接覆盖了你提前创建的实例,所以你的自定义参数完全没生效。

下面给你两种可行的解决方案,按需选择:

方案1:让test类支持传递Strategy的初始化参数

这种方法保持test类接收Strategy类的设计,但允许你在创建test实例时,把自定义的窗口参数传递进去,由test内部完成实例化:

修改后的test类代码:

class test(object):
    def __init__(self, symbol, strategy_cls, data, strategy_kwargs=None):
        """
        Parameters:
            symbol - The list strings.
            strategy_cls - (Class) The strategy class to instantiate.
            data - The data to pass to the strategy.
            strategy_kwargs - Optional keyword arguments for the strategy (like short_window/long_window).
        """
        self.symbol = symbol
        self.strategy_cls = strategy_cls
        self.data = data
        # 处理默认参数,避免None导致错误
        self.strategy_kwargs = strategy_kwargs or {}
        self._generate_instances()
    
    def _generate_instances(self):
        # 使用传入的关键字参数实例化策略
        self.strategy = self.strategy_cls(self.data, **self.strategy_kwargs)

调用示例(循环中修改参数):

# 假设你有多个窗口参数要测试
window_params = [(5, 20), (10, 40), (2, 3)]
for short_win, long_win in window_params:
    a_test = test(
        symbol=your_symbol_list,
        strategy_cls=Strategy,
        data=your_data,
        strategy_kwargs={"short_window": short_win, "long_window": long_win}
    )
    # 这里可以对a_test做后续操作,比如回测等

方案2:允许test类直接接收实例化好的Strategy对象

如果你有时候想提前创建好自定义参数的Strategy实例,再传给test类,可以修改test类的逻辑,自动判断传入的是类还是实例:

修改后的test类代码:

class test(object):
    def __init__(self, symbol, strategy, data=None):
        """
        Parameters:
            symbol - The list strings.
            strategy - Either the Strategy class or an already instantiated Strategy object.
            data - Required only if passing the Strategy class (not an instance).
        """
        self.symbol = symbol
        if isinstance(strategy, type):
            # 如果传入的是类,必须提供data来实例化
            assert data is not None, "请传入data参数,用于实例化Strategy类"
            self.strategy = strategy(data)
        else:
            # 如果传入的是实例,直接复用
            self.strategy = strategy

调用示例(循环中创建自定义实例):

window_params = [(5, 20), (10, 40), (2, 3)]
for short_win, long_win in window_params:
    # 先创建带自定义参数的Strategy实例
    custom_strategy = Strategy(your_data, short_window=short_win, long_window=long_win)
    # 传给test类
    a_test = test(symbol=your_symbol_list, strategy=custom_strategy)
    # 后续操作...

为什么原来的代码没生效?

你之前写的a_test = test(symbol,strategy(data, 2,3 )),相当于把一个Strategy实例传给了test的strategy参数,但test的__init__把这个实例赋值给了self.strategy_cls,然后_generate_instances里又执行了self.strategy_cls(self.data)——这就相当于用一个实例去调用构造方法,不仅逻辑错误,还会重新创建一个用默认参数(short_window=100、long_window=400)的Strategy实例,完全覆盖了你传入的自定义实例,所以你的参数修改没生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:35:04