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
相关产品推荐
相关产品推荐

