python的类&继承

你可以把 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 自动拥有 Animaleat() 方法。

关系是:

复制代码
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
}

如果你想告诉类型检查器:这个字典应该有 nameage,可以写:

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 会很有帮助。

相关推荐
Warson_L1 小时前
类型标注/type annotation
python
ThreeS3 小时前
手搓MiniVLA全实战教程-一步一步用pytorch解释原理与思路
人工智能·python
金銀銅鐵5 小时前
[Python] 模 n 乘法的逆元计算器
python·数学·游戏
aqi005 小时前
15天学会AI应用开发(十)把文本嵌入模型换成国产模型
人工智能·python·ai编程
金銀銅鐵1 天前
[Python] 扩展欧几里得算法
python·数学·算法
Duckdblab1 天前
DuckDB 性能调优终极指南:打造闪电般的分析体验
python
带派擂总1 天前
Python全栈开发精华版最全合集(包含各种面试题) Day24_异常和错误
python
金銀銅鐵1 天前
n^5 和 n 的个位数是否总相等?
python·数学