你可以把 Python 的 class 理解成"自定义一种对象类型"。对象里面可以有数据,也可以有行为。
1. class 是什么
比如我们定义一个 Dog:
py
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def bark(self):
print(f"{self.name}: 汪!")
使用它:
py
dog = Dog("Momo", 3)
print(dog.name) # Momo
print(dog.age) # 3
dog.bark() # Momo: 汪!
这里有几个关键点:
class Dog:定义了一个类。dog = Dog("Momo", 3)创建了一个对象,也叫实例。__init__是初始化方法,创建对象时自动执行。self指当前这个对象本身。self.name = name是把数据存到对象身上。
所以:
py
dog.name
访问的是这个具体对象的 name。
2. self 是什么
self 不是关键字,但大家约定都叫 self。
当你写:
py
dog.bark()
Python 实际上差不多是在帮你调用:
py
Dog.bark(dog)
所以方法里的第一个参数 self,就是正在调用这个方法的对象。
再看一个简单例子:
py
class Counter:
def __init__(self):
self.value = 0
def add_one(self):
self.value += 1
使用:
py
c = Counter()
c.add_one()
c.add_one()
print(c.value) # 2
self.value 保存在对象内部,所以每个对象都有自己的状态。
3. 继承是什么
继承就是:一个类可以基于另一个类扩展。
比如:
py
class Animal:
def __init__(self, name):
self.name = name
def eat(self):
print(f"{self.name} is eating")
class Dog(Animal):
def bark(self):
print(f"{self.name}: 汪!")
使用:
py
dog = Dog("Momo")
dog.eat() # Momo is eating
dog.bark() # Momo: 汪!
Dog 继承了 Animal,所以 Dog 自动拥有 Animal 的 eat() 方法。
关系是:
Animal 是父类 / 基类
Dog 是子类 / 派生类
4. 子类覆盖父类方法
如果子类定义了和父类同名的方法,就会覆盖父类的方法:
py
class Animal:
def speak(self):
print("some sound")
class Dog(Animal):
def speak(self):
print("汪!")
使用:
py
animal = Animal()
dog = Dog()
animal.speak() # some sound
dog.speak() # 汪!
这叫方法重写,英文叫 override。
5. super 是什么
如果子类想在父类初始化逻辑基础上继续扩展,可以用 super():
py
class Animal:
def __init__(self, name):
self.name = name
class Dog(Animal):
def __init__(self, name, breed):
super().__init__(name)
self.breed = breed
使用:
py
dog = Dog("Momo", "柴犬")
print(dog.name) # Momo
print(dog.breed) # 柴犬
这里:
py
super().__init__(name)
意思是:先调用父类 Animal 的初始化方法,把 name 设置好。
6. TypedDict 是什么
TypedDict 是 Python 里用来描述"字典结构"的类型工具。
比如普通字典:
py
user = {
"name": "Alice",
"age": 20
}
如果你想告诉类型检查器:这个字典应该有 name 和 age,可以写:
py
from typing import TypedDict
class User(TypedDict):
name: str
age: int
然后:
py
user: User = {
"name": "Alice",
"age": 20
}
这表示 user 应该是这样的结构:
py
{
"name": str,
"age": int
}
注意:TypedDict 主要是给类型检查工具看的,比如 Pyright、mypy、IDE。它不会在运行时强制检查。
也就是说:
py
user: User = {
"name": "Alice",
"age": "not a number"
}
Python 运行时不一定报错 ,但类型检查器会提醒你:age 应该是 int。
7. TypedDict 是 Python 原生的吗
答案稍微分版本:
- Python 3.8+:
TypedDict在标准库typing里,可以这样用:
py
from typing import TypedDict
- Python 3.7 或更早:通常从
typing_extensions导入:
py
from typing_extensions import TypedDict
所以它是 Python 标准类型系统的一部分,但它不是普通意义上那种"运行时数据类"。它更像是一个"类型标注工具"。
8. TypedDict 和 class 的区别
这个很重要。
普通 class:
py
class User:
def __init__(self, name, age):
self.name = name
self.age = age
user = User("Alice", 20)
print(user.name)
TypedDict:
py
from typing import TypedDict
class User(TypedDict):
name: str
age: int
user: User = {"name": "Alice", "age": 20}
print(user["name"])
区别:
普通 class 创建真正的对象,用点号访问:user.name
TypedDict 描述字典结构,本质还是 dict,用方括号访问:user["name"]
你在 LangGraph 里看到的这种写法:
py
class State(TypedDict):
messages: list
count: int
意思通常是:定义 graph 的状态结构。这个状态实际上传来传去还是一个字典:
py
{
"messages": [...],
"count": 3
}
LangGraph 用它来知道 state 里有哪些字段,每个字段大概是什么类型。
这也是为什么学 LangGraph 前,理解 class、继承、TypedDict 会很有帮助。