Python 魔术方法

2025 年 8 月 28 日 | 阅读 6 分钟

为了为我们创建的类添加“魔术”,我们可以定义称为“魔术方法”的特殊方法。例如,魔术方法 __init__ 和 __str__ 总是由两边的双下划线包裹。通过让我们能够访问 Python 的内置语法工具,魔术方法可以改善我们类的结构。

我们可以将 Python 的内置类与我们自己的类集成。从内置类继承的类称为子类。子类可以访问父类的所有属性,包括其方法。通过利用基本的内置功能,我们可以使用魔术方法自定义我们类的一些任务。

__init__ 方法

在我们构造类的实例之后,但在该实例返回给类的调用者之前,_init_ 方法会被执行。当我们创建类的实例时,它会自动调用,就像 C++、Java、C#、PHP 等流行编程语言中的构造函数一样。这些方法在 _new_ 之后调用,因此被称为初始化。我们应该在这里定义实例参数。

代码

输出

Now called __init__ magic method, after tha initialised parameters
<__main__.methods object at 0x3701290>
Name, standard, and marks of the student is: 
 Itika 
 11 
 98

__new__() 方法

魔术方法 __new__() 由 __init__() 方法隐式调用。__new__() 方法返回的新实例被初始化。要修改用户定义类中对象的创建,我们必须提供 __new__() 魔术方法的修改实现。我们需要提供第一个参数作为要创建其对象的类的引用,用于此静态函数。

代码

输出

Creating an instance by __new__ method
Init method is called here
<__main__.Method at 0x30dfb88>

__add__ 方法

我们使用魔术方法 __add__ 来添加类实例的属性。考虑以下场景:对象 object1 属于类 Method,对象 object2 属于类 Method 1,两者都有一个名为“attribute”的相同属性,该属性存储在创建实例时传递给类的任何值。如果指定添加属性,当操作 object1 + object2 完成时,__add__ 函数会隐式添加实例的相同属性,例如 object1.attribute + object2.attribute。

下面是代码,展示了我们如何在不使用 __add__ 魔术方法的情况下添加两个不同类的两个实例的两个属性。

代码

输出

Attribute
 27
 27 Attribute
By using __add__ magic method the code changes to this.

代码

输出

<__main__.Method object at 0x37470f0>
<__main__.Method_2 object at 0x376beb8>
 27 Attribute

上面脚本中的类 Method 和 Method_1 有一个名为“attribute”的属性,它存储一个字符串。我们创建了两个实例 instance_1 和 instances_2,其对应的属性值为“ Attribute”和“ 27”。__add__ 方法用于将操作 instance_1 + instance_2 转换为 instance_1 + instance_2.attribute,从而产生输出(27 Attribute)。

__repr__ 方法

__repr__ 魔术方法使用字符串表示类实例。每当我们尝试打印该类的对象时,__repr__ 方法会自动调用,并在输出中生成一个字符串。

代码

输出

Following are the values of the attributes of the class Method:
x = 4
y = 6
z = 2

__contains__ 方法

Python 的“in”成员运算符隐式调用 __contains__ 方法。我们可以使用 __contains__ 方法来确定一个元素是否包含在对象的属性中。我们可以将此方法用于容器(例如列表、元组等)属性。

代码

输出

4 is contained in attribute:  True
5 is contained in attribute:  False

在上面的程序中,我们使用了 __contains__ 魔术方法来确定给定整数是否包含在属性“attribute”中。在这种情况下,“attribute”是一个整数列表。整数 4 存在于作为属性传递给类 Method 的给定整数列表中。而 5 不存在于列表中。

__call__ 方法

当类实例被调用时,Python 解释器会调用魔术方法 __call__。我们可以利用 __call__ 方法使用实例名称显式调用操作,而不是创建额外的方法来执行特定活动。

代码

输出

7
35

__iter__ 方法

对于给定实例,使用 __iter__ 方法提供一个生成器对象。为了利用 __iter__ 方法,我们可以利用 iter() 和 next() 方法。

代码

输出

9
16
25
36
49
64

我们已经在代码中计算了数字的平方。对于给定范围内的数字,在上面的程序中计算平方(开始和停止)。当我们调用函数 iter(Method(3, 8)) 时,会调用 __iter__ 方法,该方法生成给定范围内数字的平方。在我们的示例中,我们使用 3 到 8 的范围;因此,调用 next() 方法将产生结果 9、16、25、36、49、64。