Appearance
Python进阶:理解class(类)
为什么要学这个
在前面的课程中,你已经学了Python的基础知识:变量、列表、循环、函数。这些已经够用了——大多数时候。
但在后面的量化策略开发中,你会看到一些代码用到了class(类)。它看起来像这样:
python
class MovingAverageStrategy:
def __init__(self, short_window=5, long_window=20):
self.short_window = short_window
self.long_window = long_window
def generate_signals(self, data):
...第一次看到这种代码,你可能会想:"这是什么鬼?"
别慌。本文就是来帮你搞懂它的。而且你只需要看懂,不需要从零写——后面有现成的模板。
从生活类比开始
你已经学过的Python知识,可以这样对应:
| Python概念 | 生活类比 | 说明 |
|---|---|---|
| 变量 | 店名 | 一个名字存一个值,如 shop_name = "小明的奶茶店" |
| 列表 | 菜单 | 一堆东西放一起,如 menu = ["珍珠奶茶", "拿铁", "柠檬茶"] |
| 函数 | 做奶茶的步骤 | 一段可复用的操作,如 def make_milk_tea(): ... |
| class | 一整家奶茶店 | 把店名、菜单、做奶茶的步骤打包在一起 |
class就是"把相关的数据和操作打包在一起"的方式。
一个奶茶店的class
让我们用代码来开一家奶茶店:
python
# 定义一个"奶茶店"的模板(class)
class MilkTeaShop:
# 这是"初始化"方法,开新店时执行一次
def __init__(self, name, menu):
self.name = name # 店名
self.menu = menu # 菜单
self.sales = 0 # 今日销售额
# 卖一杯奶茶的方法
def sell(self, drink_name, price):
if drink_name in self.menu: # 检查菜单上有没有
self.sales += price # 加上销售额
return f"卖出了一杯{drink_name},{price}元"
else:
return f"抱歉,我们没有{drink_name}"
# 查看今日营业额的方法
def check_sales(self):
return f"{self.name}今日营业额:{self.sales}元"逐行解释:
class MilkTeaShop:— 告诉Python"我要定义一个叫MilkTeaShop的模板"def __init__(self, name, menu):— 开新店时要做的事情(初始化)self.name = name— 把传入的店名保存下来,self就是"这家店自己"def sell(self, ...)— 定义一个"卖奶茶"的操作self.sales += price— 在自己的销售额上加上这一单
用这个模板开两家店
python
# 用模板开第一家店
shop_a = MilkTeaShop("小明奶茶", ["珍珠奶茶", "拿铁"])
# 用模板开第二家店
shop_b = MilkTeaShop("小红奶茶", ["柠檬茶", "芒果冰"])
# 各卖几杯
print(shop_a.sell("珍珠奶茶", 15)) # 卖出了一杯珍珠奶茶,15元
print(shop_a.sell("拿铁", 18)) # 卖出了一杯拿铁,18元
print(shop_b.sell("柠檬茶", 12)) # 卖出了一杯柠檬茶,12元
# 查看营业额
print(shop_a.check_sales()) # 小明奶茶今日营业额:33元
print(shop_b.check_sales()) # 小红奶茶今日营业额:12元看到没?同一个模板,可以创建不同的店,各自独立运营。
和投资的联系
为什么要用class来写量化策略?
| 奶茶店 | 量化策略 |
|---|---|
| 模板(class) | 策略模板 |
| 店名、菜单 | 策略名称、参数(如均线天数) |
| 做奶茶的步骤 | 计算信号的方法 |
| 开多家店 | 用不同参数跑不同策略 |
python
# 量化策略中的class大概长这样
class MAStrategy:
def __init__(self, short_days=5, long_days=20): # 参数就像"配方"
self.short_days = short_days
self.long_days = long_days
def run(self, stock_data): # 运行策略就像"做奶茶"
# 计算均线...
# 生成买卖信号...
pass
# 用同一套策略,不同参数,跑两只股票
strategy_a = MAStrategy(short_days=5, long_days=20) # 短期参数
strategy_b = MAStrategy(short_days=10, long_days=30) # 长期参数就像你可以用同一个奶茶店模板开不同的店,你也可以用同一个策略模板跑不同的参数。
你需要掌握的程度
这里说清楚:你只需要看懂class在做什么,不需要从零写class。
具体来说:
| 程度 | 要求 | 说明 |
|---|---|---|
| 能看懂 | 必须 | 看到class代码能理解每个部分在做什么 |
| 能改参数 | 必须 | 知道怎么修改__init__里的参数 |
| 能从零写 | 不需要 | 后面有现成模板,复制改就行 |
就像你会开车,但不一定会造车。你会用奶茶店的点单系统,但不一定需要自己设计一个。
常见疑问
self是什么?
self就是"自己"——"这家店自己"或"这个策略自己"。每个实例有自己的self,互不干扰。
你可以理解为Python的self就像中文里的"本店":
self.name= "本店的名字"self.sales= "本店的营业额"
__init__是什么?
__init__是"初始化"的意思,就是"创建新实例时自动执行的代码"。就像"新店开张时要做的事情"——挂招牌、准备菜单、清零收银机。
我一定要用class吗?
不一定。简单的事情用函数就够了。但在量化策略中,class的好处是:
- 把策略的参数和数据打包在一起,不容易乱
- 可以轻松创建多个策略实例
- 代码组织更清晰
小结
| 概念 | 说明 |
|---|---|
| class | 一个模板,把数据和操作打包在一起 |
__init__ | 初始化方法,创建实例时自动执行 |
self | "自己",引用当前实例的数据和方法 |
| 实例 | 用模板创建的具体对象,如"小明奶茶" |
| 学习目标 | 看懂 + 改参数,不需要从零写 |
💡 不用死记硬背class的语法。后面遇到具体的策略代码时,对照本文再看一遍,会有更深的理解。
下一篇:Python数据处理进阶