如何修改类属性默认值?Python类属性循环赋值问题求助
我来帮你搞定这个问题!先分析下你代码里的核心问题:你的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

