当前位置:首页 > Python > 正文

Python双下划线方法详解:掌握魔术方法的核心技巧 | Python高级编程教程

Python双下划线方法完全指南

深入探索Python魔术方法的核心原理与实际应用

什么是双下划线方法?

在Python中,双下划线方法(也称为"魔术方法"或"特殊方法")是以双下划线开头和结尾的方法(例如__init__、__str__)。它们允许类定义自己的行为,以便与Python内置操作符和函数无缝集成。

为什么使用双下划线方法?

  • 实现运算符重载(如+、-、*、/)
  • 自定义对象初始化过程
  • 定义对象的字符串表示形式
  • 使对象可迭代或支持索引访问
  • 模拟内置容器类型的行为

核心双下划线方法详解

__init__ - 对象构造器

在创建类的新实例时自动调用,用于初始化对象属性。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 创建实例
p = Person("Alice", 30)
print(p.name)  # 输出: Alice

__str__ 和 __repr__ - 对象字符串表示

__str__:定义对象的"非正式"字符串表示,用于print()函数

__repr__:定义对象的"正式"字符串表示,用于调试和开发

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    def __str__(self):
        return f"Point({self.x}, {self.y})"
    
    def __repr__(self):
        return f"Point(x={self.x}, y={self.y})"

p = Point(3, 4)
print(str(p))   # 输出: Point(3, 4)
print(repr(p))  # 输出: Point(x=3, y=4)

__len__ - 定义对象长度

允许对象响应内置的len()函数,返回容器中元素的数量。

class Playlist:
    def __init__(self, songs):
        self.songs = songs
        
    def __len__(self):
        return len(self.songs)

playlist = Playlist(["Song1", "Song2", "Song3"])
print(len(playlist))  # 输出: 3

__getitem__ 和 __setitem__ - 索引访问

使对象支持索引操作,如obj[index]和obj[index] = value。

class MyList:
    def __init__(self, items):
        self.items = items
        
    def __getitem__(self, index):
        return self.items[index]
    
    def __setitem__(self, index, value):
        self.items[index] = value

my_list = MyList([10, 20, 30])
print(my_list[1])  # 输出: 20
my_list[1] = 25
print(my_list[1])  # 输出: 25

__iter__ 和 __next__ - 创建可迭代对象

使对象可以被迭代(例如在for循环中使用)。

class Countdown:
    def __init__(self, start):
        self.start = start
        
    def __iter__(self):
        self.current = self.start
        return self
        
    def __next__(self):
        if self.current <= 0:
            raise StopIteration
        else:
            self.current -= 1
            return self.current + 1

# 使用迭代
for num in Countdown(5):
    print(num, end=" ")  # 输出: 5 4 3 2 1

__call__ - 使对象可调用

允许类的实例像函数一样被调用。

class Adder:
    def __init__(self, base):
        self.base = base
        
    def __call__(self, x):
        return self.base + x

add_five = Adder(5)
print(add_five(3))   # 输出: 8
print(add_five(10))  # 输出: 15

进阶双下划线方法

运算符重载方法

  • __add__(self, other) → +
  • __sub__(self, other) → -
  • __mul__(self, other) → *
  • __lt__(self, other) → <
  • __eq__(self, other) → ==

上下文管理方法

  • __enter__(self) → with语句开始时调用
  • __exit__(self, ...) → with语句结束时调用

属性访问方法

  • __getattr__(self, name)
  • __setattr__(self, name, value)
  • __delattr__(self, name)

关键要点总结

  • 双下划线方法让Python对象与语言内置功能无缝集成
  • __init__是最常用的魔术方法,用于对象初始化
  • __str__和__repr__提供对象的字符串表示,用于不同场景
  • __len__、__getitem__和__setitem__使对象表现得像容器
  • __iter__和__next__实现自定义迭代行为
  • __call__让对象像函数一样可调用
  • 合理使用魔术方法可以创建更直观、更Pythonic的API

发表评论