首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第7章 编程术语
7.1 编程术语定义
7.1.1 作为语言的Python和作为解释器的Python
7.1.2 垃圾回收
7.1.3 字面量
7.1.4 关键字
7.1.5 对象、值、实例和身份
7.1.6 项
7.1.7 可变和不可变
7.1.8 索引、键和哈希值
7.1.9 容器、序列、映射和集合类型
7.1.10 特殊方法
7.1.11 模块和包
7.1.12 可调用对象和头等对象
7.2 经常被混淆的术语
7.2.1 语句和表达式
7.2.2 块、子句和主体
7.2.3 变量和特性
7.2.4 函数和方法
7.2.5 可迭代对象和迭代器
7.2.6 语法错误、运行时错误和语义错误
7.2.7 形参和实参
7.2.8 显式类型转换和隐式类型转换
7.2.9 属性和特性
7.2.10 字节码和机器码
7.2.11 脚本和程序,以及脚本语言和编程语言
7.2.12 库、框架、SDK、引擎、API
第8章 常见的Python陷阱
8.1 循环列表的同时不要增删其中的元素
8.2 复制可变值时务必使用copy.copy()和copy.deepcopy()
8.3 不要用可变值作为默认参数
8.4 不要通过字符串连接创建字符串
8.5 不要指望sort()按照字母顺序排序
8.6 不要假设浮点数是完全准确的
8.7 不要使用链式!=运算符
8.8 不要忘记在仅有一项的元组中添加逗号
第9章 Python的奇特难懂之处
9.1 为什么256 是256,而257 不是257
9.2 字符串驻留
9.3 假的Python 增量运算符和减量运算符
9.4 传递空列表给all()
9.5 布尔值是整数值
9.6 链式使用多种运算符
9.7 Python 的反重力特性
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(三)
小册名称:Python编程轻松进阶(三)
### 7.1.10 特殊方法:Python中的魔法函数 在Python中,特殊方法(也称为魔法方法或双下划线方法)是一类具有特殊命名约定(以双下划线`__`开头和结尾)的方法。它们为Python的类提供了丰富的接口,允许对象进行诸如算术运算、属性访问、字符串表示、内存管理、比较、迭代等操作时的自定义行为。理解和掌握这些特殊方法对于编写高效、灵活的Python代码至关重要。本章节将深入探讨几种常见的特殊方法,展示它们如何在Python编程中发挥作用。 #### 1. 构造与析构 ##### `__init__(self, ...)` `__init__`是类的初始化方法,当创建类的新实例时自动调用。它用于设置对象的初始状态或执行任何必要的设置。虽然`__init__`不是严格意义上的特殊方法(因为它在子类中可以被覆盖),但它是对象创建过程中不可或缺的一部分。 ```python class Point: def __init__(self, x, y): self.x = x self.y = y p = Point(3, 4) print(p.x, p.y) # 输出: 3 4 ``` ##### `__del__(self)` `__del__`是对象的析构方法,当对象即将被垃圾回收器销毁时调用。它通常用于执行清理操作,如关闭文件或释放非托管资源。但需注意,Python的垃圾回收机制并不保证何时会调用`__del__`,因此不应依赖它来执行关键资源的释放。 ```python class Resource: def __init__(self, name): self.name = name print(f"{name} allocated.") def __del__(self): print(f"{self.name} deallocated.") r = Resource("Resource1") # 当r对象不再被需要时,Python解释器可能会在某个时间点调用其__del__方法 ``` #### 2. 算术运算符重载 Python允许通过定义特殊方法来重载算术运算符,如加(`__add__`)、减(`__sub__`)、乘(`__mul__`)、除(`__truediv__`)、取模(`__mod__`)等。 ```python class Vector2D: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): return Vector2D(self.x + other.x, self.y + other.y) def __mul__(self, scalar): return Vector2D(self.x * scalar, self.y * scalar) v1 = Vector2D(2, 3) v2 = Vector2D(4, 5) print(v1 + v2) # 输出: Vector2D(x=6, y=8) print(v1 * 2) # 输出: Vector2D(x=4, y=6) ``` #### 3. 字符串与表示 ##### `__str__(self)` `__str__`方法定义了对象的“非正式”字符串表示,即使用`print()`函数或`str()`函数时调用的方法。 ```python class Person: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return f"{self.name} is {self.age} years old." p = Person("Alice", 30) print(p) # 输出: Alice is 30 years old. ``` ##### `__repr__(self)` `__repr__`方法定义了对象的“官方”字符串表示,旨在提供一个明确、无歧义的表示,以便可以通过`eval()`函数重新创建对象。 ```python class Person: # 假设这里也定义了__init__ def __repr__(self): return f"Person(name='{self.name}', age={self.age})" p = Person("Bob", 25) print(repr(p)) # 输出: Person(name='Bob', age=25) ``` #### 4. 属性访问 ##### `__getattr__(self, name)` 当尝试访问的属性不存在时,Python会调用`__getattr__`方法。这可以用于实现动态属性或懒加载。 ```python class LazyLoad: def __init__(self): self.data = None def fetch_data(self): # 模拟从数据库或其他源加载数据 self.data = "Loaded data" def __getattr__(self, name): if name == 'data' and self.data is None: self.fetch_data() return super().__getattr__(name) ll = LazyLoad() print(ll.data) # 触发__getattr__,加载数据并返回 ``` ##### `__setattr__(self, name, value)` 每当尝试设置对象的属性时,Python都会调用`__setattr__`方法。使用时要小心,因为直接调用`self.name = value`会在`__setattr__`内部再次触发自身,导致无限递归。 ```python class Validator: def __setattr__(self, name, value): if name == 'age' and not isinstance(value, int): raise ValueError("Age must be an integer.") super().__setattr__(name, value) v = Validator() v.name = "John" # 正常 try: v.age = "thirty" # 抛出异常 except ValueError as e: print(e) ``` #### 5. 容器方法 ##### `__len__(self)` 定义了当对容器对象使用内置`len()`函数时应该返回什么值。 ##### `__getitem__(self, key)` 定义了当使用索引、切片或迭代来访问对象元素时的行为。 ##### `__setitem__(self, key, value)` 定义了当通过索引、切片赋值时应该执行什么操作。 ##### `__iter__(self)` 定义了对象的迭代行为,必须返回一个迭代器。 ##### `__contains__(self, item)` 定义了使用`in`关键字时对象的成员测试行为。 #### 6. 比较运算符 Python通过一系列特殊方法支持对象的比较操作,如`__eq__`(等于)、`__ne__`(不等于)、`__lt__`(小于)、`__le__`(小于等于)、`__gt__`(大于)、`__ge__`(大于等于)。 ```python class Number: def __init__(self, value): self.value = value def __eq__(self, other): if isinstance(other, Number): return self.value == other.value return NotImplemented # 可以实现其他比较方法... n1 = Number(5) n2 = Number(5) print(n1 == n2) # 输出: True ``` ### 结语 特殊方法是Python面向对象编程中的强大工具,它们允许开发者以直观和Pythonic的方式扩展和定制对象的行为。通过理解和熟练使用这些特殊方法,可以编写出更加灵活、强大且易于维护的Python代码。在本章节中,我们探讨了构造与析构、算术运算符重载、字符串与表示、属性访问、容器方法以及比较运算符等几大类特殊方法,它们仅仅是Python中众多特殊方法的一小部分。随着对Python的深入学习,你将发现更多有用的特殊方法,并能够在你的项目中灵活运用它们。
上一篇:
7.1.9 容器、序列、映射和集合类型
下一篇:
7.1.11 模块和包
该分类下的相关小册推荐:
Python合辑13-面向对象编程案例(上)
Python与办公-玩转Word
Python合辑10-函数
Python合辑11-闭包函数
Python编程轻松进阶(二)
Python合辑7-集合、列表与元组
Python机器学习实战
Python高并发编程与实战
Python合辑12-面向对象
Python与办公-玩转PDF
Python合辑4-130个字符串操作示例
实战Python网络爬虫