Class (类)
官方文档:https://docs.python.org/zh-cn/3.12/tutorial/classes.html
类(class)是 Python 中 封装数据(属性)和行为(方法) 的核心工具。
实例(object)是类的具体对象。
例:
class User:
def __init__(self, name):
self.name = name
u = User("jack")
class MyClass:
class_var = 123 # 类变量
def __init__(self, x): # 构造函数
self.x = x # 实例变量
def method(self): # 实例方法
return self.x * 2
@classmethod
def cmethod(cls): # 类方法
return cls.class_var
@staticmethod
def smethod(a, b): # 静态方法
return a + b
@property
def doubled(self): # 计算属性
return self.x * 2
| 方法类型 | 自动传入 | 用途 |
|---|---|---|
| 普通方法 | self(实例) | 操作实例数据 |
| 类方法 | cls(类) | 工厂方法、访问类属性、子类适配 |
| 静态方法 | 无 | 工具函数,与类有关但不需要实例 |
| property | self | 优雅访问计算属性 |
staticmethod / classmethod / property 就是这个部分。
构造函数在创建对象时自动执行:
class User:
def __init__(self, name, age=18):
self.name = name
self.age = age
实例变量(每个对象独立)
self.name
类变量(所有对象共享)
User.role = "guest"
⚠️ 不要滥用类变量(全局共享数据容易带来状态污染)。
class Animal:
def speak(self):
return "..."
class Dog(Animal):
def speak(self):
return "woof"
调用父类方法:
class Admin(User):
def __init__(self, name):
super().__init__(name)
self.role = "admin"
魔术方法可以让类表现得像内置类型。
常用的:
| 方法 | 功能 |
| __str__ | 打印可读字符串 |
| __repr__ | 调试友好的表示 |
| __len__ | len(obj) |
| __getitem__ | 支持索引访问 |
| __setitem__ | 支持 obj[key] = value |
| __iter__ | 可迭代 |
| __next__ | 迭代器 |
| __enter__ / __exit__ | 上下文管理器(with) |
例:
class Counter:
def __init__(self, n):
self.n = n
def __len__(self):
return self.n
Python 的最优雅的数据对象写法。
from dataclasses import dataclass
@dataclass
class Stock:
code: str
name: str
price: float
自动生成:
__init____repr____eq__- 结构化支持
class User:
@classmethod
def from_dict(cls, data):
return cls(data["name"])
class Stock:
def __init__(self, code):
self.code = code
@property
def market(self):
return "SZ" if self.code.startswith("00") else "SH"
class Singleton:
_instance = None
@classmethod
def instance(cls):
if cls._instance is None:
cls._instance = cls()
return cls._instance
你可以把一堆工具函数放入类中,不实例化:
class StringUtils:
@staticmethod
def is_empty(s):
return not s
用类的场景:
- 需要保存状态
- 需要协作多个方法
- 对象需要具备多种行为
- 需要 property / staticmethod / classmethod
- 需要继承 / 多态
- 复杂对象建模(你常用的 stock/news 数据)
用函数的场景:
- 单一逻辑
- 无状态
- 工具函数(如你 utils 中的大部分)
你 FastAPI + SQLAlchemy 项目里类主要用途:
class User(Base):
@dataclass
class NewsDetail:
class StockUtils:
@staticmethod
def normalize(code): ...
class AppConfig:
class NewsService:
def get_news(self): ...
- ❌ 在类中滥用全局变量
- ❌ 用静态方法存储状态
- ❌ 过度面向对象
- ❌ 工具类使用实例方法
- ❌ 魔术方法滥用导致可读性差
- ❌ 误用类变量导致共享数据污染
- ❌ 不写类型注解(你不会)
属性(变量)
行为(方法)
构造(__init__)
静态方法(无self)
类方法(cls)
property(计算属性)
魔术方法(协议)
继承 & super
dataclass(数据类)
有状态 -> 用类
无状态 -> 用函数
有行为组合 -> 用类
需要继承扩展 -> 用类
- 数据建模(ORM / dataclass)
- 工具类(static/class)
- 服务层(业务逻辑封装)