J'Blog

9 课 · 入门

语义检索

基于 Chroma 向量库,与 Workspace 知识库分离。用自然语言描述你想查的内容。 非管理员每人每天可检索 5 次(消耗站点 AI 配额)。

类与对象

原文:类与对象

一句话

Python面向对象编程基础,教你如何创建自定义数据结构和行为。

什么时候翻这页

  • 当你需要为Agent设计自定义工具类时
  • 当你需要实现Agent的状态管理机制时
  • 当你需要理解Python迭代器协议,为Agent创建可迭代数据源时
  • 当你需要构建具有层次结构的Agent组件时

核心概念

  • 类与对象:类是创建对象的蓝图,对象是类的实例,包含数据属性和方法
  • 命名空间:从名称到对象的映射,如内置名称、模块全局名称、函数局部名称
  • 作用域:Python代码中可直接访问命名空间的文本区域,分为局部、闭包、全局和内置作用域
  • 实例变量:属于特定实例的数据,每个实例独立
  • 类变量:属于类本身的数据,所有实例共享
  • 继承:创建新类时获取已有类的属性和方法,支持多重继承
  • 迭代器:实现了__iter__()__next__()方法的对象,用于遍历数据
  • 生成器:使用yield语句的函数,自动创建迭代器并保存执行状态

怎么做

  1. 定义类
class MyClass:
    """一个简单的示例类"""
    i = 12345  # 类变量

    def __init__(self, value):  # 初始化方法
        self.data = [value]  # 实例变量

    def f(self):  # 实例方法
        return 'hello world'
  1. 创建实例
x = MyClass(42)  # 创建实例
print(x.i)  # 访问类变量: 12345
print(x.data)  # 访问实例变量: [42]
print(x.f())  # 调用方法: 'hello world'
  1. 使用继承
class DerivedClass(MyClass):
    def __init__(self, value, extra):
        super().__init__(value)  # 调用父类初始化
        self.extra = extra  # 添加新属性

    def f(self):  # 重写父类方法
        return f'hello {self.extra}'
  1. 创建迭代器
class Reverse:
    def __init__(self, data):
        self.data = data
        self.index = len(data)
    
    def __iter__(self):
        return self
    
    def __next__(self):
        if self.index == 0:
            raise StopIteration
        self.index -= 1
        return self.data[self.index]
  1. 使用生成器
def reverse(data):
    for index in range(len(data)-1, -1, -1):
        yield data[index]  # 生成值而不是返回

for char in reverse('golf'):
    print(char)  # 输出: f, l, o, g

命令 / API 速查

语法/函数描述
class ClassName:定义类
__init__(self, ...)初始化方法
self实例引用,方法第一个参数
iter(obj)获取对象的迭代器
next(iterator)获取迭代器的下一个元素
yield value生成值,创建生成器函数
isinstance(obj, class)检查对象是否是指定类的实例
issubclass(class1, class2)检查类是否是另一个类的子类
@dataclass装饰器,自动生成数据类方法

与 Agent 开发的联系

  • 类和对象可用于实现Agent的核心组件,如记忆系统、决策模块和工具封装
  • 迭代器和生成器可用于处理Agent需要处理的大量数据流,实现高效的数据处理
  • 继承机制可用于构建Agent的层次化架构,使Agent能够扩展和定制基础功能
  • 私有变量可用于封装Agent的内部状态,保护数据完整性并提供清晰的API边界

初学者易错点

  • 混淆实例变量和类变量,导致意外共享状态
  • 忘记在方法定义中包含self参数,导致方法调用失败
  • 错误地使用全局变量而非实例变量,破坏面向对象封装原则
  • 不理解迭代器协议就尝试实现自定义迭代器,导致循环异常
  • 在多重继承中不清楚方法解析顺序,导致意外的方法调用

相关词条

  • tutorial-inheritance 继承与多态
  • tutorial-dataclasses 数据类
  • tutorial-iterators 迭代器与生成器
  • tutorial-oop 面向对象编程
  • tutorial-modules 模块与包
  • tutorial-exceptions 异常处理

官方原文:https://docs.python.org/zh-cn/3/tutorial/classes.html