📅 今日知识点
-
核心主题:深入理解Python中的dunder(魔术)方法
-
适用场景:面向对象编程、自定义类行为、提升代码可读性
🧠 什么是Dunder方法?
Dunder方法(Double Underscore Methods)是Python中以双下划线开头和结尾的特殊方法,例如 __init__、__str__ 等。它们允许我们自定义类的行为,让对象支持运算符、打印、迭代等功能。
🔧 核心Dunder方法分类与示例
1. 初始化与销毁
__init__(self, ...)
- 用途:对象创建时自动调用,用于初始化属性。
class Student:
def __init__(self, name, score):
self.name = name
self.score = score
s = Student("张三", 95)
print(s.name) # 输出: 张三
__del__(self)
-
用途:对象销毁前调用,可用于清理资源。
class FileHandler:
def __del__(self):
print("文件句柄已释放")
2. 字符串表示
__str__(self)
-
用途:定义
print(obj)或str(obj)的输出。
class Car:
def __init__(self, brand):
self.brand = brand
def __str__(self):
return f"汽车品牌: {self.brand}"
car = Car("特斯拉")
print(car) # 输出: 汽车品牌: 特斯拉
__repr__(self)
- 用途:开发者调试时显示的内容,建议返回可重构对象的表达式。
def __repr__(self):
return f'Car("{self.brand}")'
3. 运算符重载
__add__(self, other)
-
用途:定义
+运算符的行为。
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2
print(v3.x, v3.y) # 输出: 4 6
__eq__(self, other)
-
用途:定义
==比较逻辑。
def __eq__(self, other):
return self.x == other.x and self.y == other.y
4. 容器行为
__len__(self)
- 用途:支持
len(obj)。
class MyList:
def __init__(self, data):
self.data = data
def __len__(self):
return len(self.data)
ml = MyList([1, 2, 3])
print(len(ml)) # 输出: 3
__getitem__(self, key)
-
用途:支持
obj[key]访问。
def __getitem__(self, index):
return self.data[index]
5. 可调用对象
__call__(self, ...)
-
用途:让实例可以像函数一样被调用。
class Multiplier:
def __init__(self, factor):
self.factor = factor
def __call__(self, x):
return x * self.factor
double = Multiplier(2)
print(double(5)) # 输出: 10
🚀 实战案例:自定义分数类
class Fraction:
def __init__(self, numerator, denominator):
self.numerator = numerator
self.denominator = denominator
def __str__(self):
return f"{self.numerator}/{self.denominator}"
def __add__(self, other):
new_num = self.numerator * other.denominator + other.numerator * self.denominator
new_den = self.denominator * other.denominator
return Fraction(new_num, new_den)
f1 = Fraction(1, 2)
f2 = Fraction(1, 3)
result = f1 + f2
print(result) # 输出: 5/6
❗ 注意事项
- 不要滥用dunder方法,保持代码清晰易懂
- 遵循Python惯例,避免自定义非标准的dunder方法
- 测试边界条件,确保方法行为符合预期
💡 小贴士
- 学会阅读官方文档了解经常使用的dunder方法
- 利用IDE提示快速查找相关方法
- 多实践,从简单类开始逐步掌握复杂用法