跳转至

Python 进阶教程系列 1:双下划线的魔法方法

在构建大型项目时,一些进阶的 Python 开发技术能够让我们编写可复用、可拓展、更优雅、更高效的代码,使得代码清晰、整洁且便于维护。本系列笔记参考了 YouTube NeuralNine 频道Python Advanced Tutorials 系列视频,内容涵盖魔法函数、装饰器、生成器、参数解析等内容。

本文是 Python 进阶教程系列 1,主要介绍了双下划线的魔法方法的作用及示例代码,包括__init____str____len____getitem____add____call____format__ 等。

image-20230724232129477

双下划线 Dunder

"Dunder"是"Double Under"(双下划线)方法的缩写。在 Python 中,魔法方法以双下划线开头和结尾,因此有时也被称为"Dunder Methods"。

例如,__init____str____len____getitem__等都是 Python 中常见的魔法方法,它们具有特殊的功能和用途。这些方法通过使用双下划线作为前缀和后缀来标识,以便与普通方法区分开来。

常见的 Python 魔法方法及其功能

__init__

__init__: 初始化方法,用于创建对象并设置其初始状态。

示例代码:

Python
class MyClass:
    def __init__(self, name):
        self.name = name

obj = MyClass("John")

__str__

__str__: 返回对象的字符串表示形式, 可通过str(obj)print(obj)调用

示例代码:

Python
class MyClass:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f"MyClass object with name: {self.name}"

obj = MyClass("John")
print(obj)  # 输出:MyClass object with name: John

__len__

__len__: 返回对象的长度, 可通过len(obj)调用

示例代码:

Python
class MyList:
    def __init__(self, items):
        self.items = items

    def __len__(self):
        return len(self.items)

my_list = MyList([1, 2, 3, 4, 5])
print(len(my_list))  # 输出:5

__getitem__

__getitem__: 获取对象的元素, 可通过索引或切片调用

示例代码:

Python
class MyList:
    def __init__(self, items):
        self.items = items

    def __getitem__(self, index):
        return self.items[index]

my_list = MyList([1, 2, 3, 4, 5])
print(my_list[2])  # 输出:3
print(my_list[1:4])  # 输出:[2, 3, 4]

__add__

__add__:定义对象之间的加法操作。当 使用+运算符对两个对象进行相加 时,解释器会尝试调用对象的__add__方法来执行加法操作。

示例代码:

Python
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        if isinstance(other, Point):
            return Point(self.x + other.x, self.y + other.y)
        else:
            raise TypeError("Unsupported operand type: +")

# 创建两个点对象
point1 = Point(1, 2)
point2 = Point(3, 4)

# 使用加法操作符相加
result = point1 + point2

# 打印结果
print(result.x, result.y)

通过使用+运算符对两个Point对象进行相加,解释器会自动调用point1.__add__(point2),并返回结果。在上面的示例中,我们将点(1, 2)和点(3, 4)相加得到了新的点(4, 6)

__call__

__call__:用于使对象可以像函数一样被调用。当对一个对象 使用函数调用运算符() 时,解释器会尝试调用对象的__call__方法。

示例代码:

Python
class Counter:
    def __init__(self):
        self.count = 0

    def __call__(self):
        self.count += 1
        print(f"Current count: {self.count}")

# 创建一个计数器对象
counter = Counter()

# 调用计数器对象,效果类似于函数调用
counter()  # 输出:Current count: 1
counter()  # 输出:Current count: 2
counter()  # 输出:Current count: 3

在上面的示例中,我们定义了一个Counter类,它具有一个count属性和一个__call__方法。在__call__方法中,我们将计数器的值加 1,并打印当前的计数值。

通过将对象当作函数进行调用,解释器会自动调用counter.__call__(),从而执行__call__方法中的逻辑。在上面的示例中,我们通过多次调用counter(),实现了计数器的功能。

通过实现__call__方法,我们可以使对象具有函数的行为,这在某些情况下非常有用。例如,可以将对象用作可调用的回调函数、装饰器或上下文管理器等。

__format__

参考:Python——详解__str__, __repr__和__format__

其他魔法方法

《流畅的 Python》第 1 章中列出了 Python 中魔法方法:

image-20230724232122893

评论