You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python官方教程类章节疑难求助:求通俗解释及示例代码

Python官方教程“杂项”内容解释

一、用自定义类替代期望的抽象数据类型

简单说就是:如果一段代码本来是用来处理某个特定类型的对象(比如文件对象),你不用非得传这个类型的对象,只要自己写个类,实现了原类型的关键方法,就能把这个类的实例传进去用,原代码完全不用改。

举个实际例子:假设你有个函数专门处理文件内容,它依赖文件对象的read()、readline()这些方法。现在你不想读真实文件,想直接用字符串里的内容,就可以写个模拟文件行为的类:

# 原本处理文件对象的函数,不用修改
def process_content(source):
    print("=== 读取全部内容 ===")
    print(source.read())
    # 重置读取位置
    source.seek(0)
    print("\n=== 逐行读取内容 ===")
    line = source.readline()
    while line:
        print(line.strip())
        line = source.readline()

# 自定义类,模拟文件对象的核心方法
class FakeFile:
    def __init__(self, text):
        self.text = text
        self.current_pos = 0

    def read(self):
        # 返回全部文本,重置位置
        result = self.text
        self.current_pos = 0
        return result

    def readline(self):
        # 找到当前位置后的换行符
        newline_pos = self.text.find('\n', self.current_pos)
        if newline_pos == -1:
            # 没有换行,返回剩余内容
            line = self.text[self.current_pos:]
            self.current_pos = len(self.text)
        else:
            # 返回当前行,位置移到下一行开头
            line = self.text[self.current_pos:newline_pos+1]
            self.current_pos = newline_pos + 1
        return line

    def seek(self, pos):
        # 实现seek方法,满足原函数的需求
        self.current_pos = pos

# 测试:用自定义类的实例替代文件对象
test_text = """这是第一行内容
这是第二行内容
我们正在模拟文件对象的行为"""
fake_file = FakeFile(test_text)
process_content(fake_file)

运行这段代码,你会发现process_content完全能处理FakeFile的实例,因为这个类实现了它需要的方法——这就是Python里的鸭子类型:不管你是什么类型,只要有对应的方法,就能当对应的角色用。

二、实例方法的__self__和__func__属性

当你创建类的实例后,实例的方法其实是“绑定”到这个实例上的对象,它有两个特殊属性:

  • __self__:指向拥有这个方法的实例本身。
  • __func__:指向类里定义的原始函数(没绑定到实例时的版本)。

看示例代码更清楚:

class Greeting:
    def say_hi(self, name):
        print(f"嗨,{name}!")

# 创建实例
greet_obj = Greeting()
# 获取实例的方法对象
hi_method = greet_obj.say_hi

# 查看__self__:就是我们创建的greet_obj实例
print(hi_method.__self__)  # 输出类似 <__main__.Greeting object at 0x102345678>
print(hi_method.__self__ is greet_obj)  # 输出 True

# 查看__func__:是类里定义的say_hi函数
print(hi_method.__func__)  # 输出类似 <function Greeting.say_hi at 0x108765432>
# 直接调用__func__需要手动传入实例作为第一个参数
hi_method.__func__(greet_obj, "张三")  # 输出 嗨,张三!
# 而调用绑定后的方法,会自动把实例传给self参数
hi_method("李四")  # 输出 嗨,李四!

简单理解:绑定方法就是把函数和实例打包在一起了,__self__是打包的实例,__func__是打包的原始函数。

内容的提问来源于stack exchange,提问作者Anson Hwang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:08:18