【每日一技】掌握Python中的Dunder方法

0 阅读2分钟

📅 今日知识点

  • 核心主题:深入理解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提示快速查找相关方法
  • 多实践,从简单类开始逐步掌握复杂用法