一文带你探索Python中15个常见的魔术方法

 更新时间:2024年01月24日 08:11:35   作者:努力的DJ  
在Python中,特殊方法(也称为魔术方法)是由Python解释器自动调用的,我们不需要手动调用它们,本文小编为大家整理了15个常见特殊方法的实现,希望对大家有所帮助

概述

在Python中,特殊方法(也称为魔术方法)是由Python解释器自动调用的,我们不需要手动调用它们,而是使用内置函数来间接地使用它们。举个例子,我们可以实现特殊方法__len__(),然后通过使用内置函数len()来获取对象的长度。同样地,一些特殊方法的调用是隐式的,比如在使用for循环时,实际上是在使用内置函数iter(x)来迭代对象x。

在Java中,并没有像Python那样简单的实现方式。如果要进行比较,你需要实现compare方法;如果想要生成特定的对象,必须编写适当的构造器方法;如果想要打印对象,就需要实现toString方法等等。此外,在Java中的魔术类或方法以及各种本地方法基本上是不允许我们修改的。因此,我们还是简单地看一下Python是如何调用的吧。

常用特殊方法及实现

下面将介绍一些常用特殊方法和实现。

__init__(self, ...)

构造函数主要用于初始化对象的属性。通过在类中定义__init__方法,可以在创建对象时自动调用该方法来初始化对象的属性。在构造函数中,可以通过self参数来访问对象的属性和方法,并为其赋予初始值。构造函数在对象创建时只会被调用一次,可以在其中执行一些必要的初始化操作,以确保对象在创建后处于正确的状态。

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

person = Person('xiaoyu', 18)
print(person.name)  # 输出: xiaoyu
print(person.age)   # 输出: 18

__str__(self)

返回对象的字符串表示,可通过print(obj)来调用。这个方法对于调试和输出对象信息非常有用,可以提供更友好和可读性更高的输出结果。通过实现__str__方法,我们可以轻松地控制对象的打印行为,使其更符合我们的需求和预期。

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

    def __str__(self):
        return f"Person: {self.name}, {self.age} years old"

person = Person('xiaoyu', 18)
print(person)  # 输出: Person: xiaoyu, 18 years old

__repr__(self)

返回对象的可打印字符串表示,可通过obj来调用。与__str__方法类似,__repr__方法也用于提供对象的字符串表示,但它的目标是更加精确和完整地描述对象的内部状态和结构。

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

    def __repr__(self):
        return f"Person(name={self.name}, age={self.age})"

person = Person('xiaoyu', 18)
print(person)  # 输出: Person(name=xiaoyu, age=18)

__len__(self)

返回对象的长度,可通过len(obj)来调用。在Python中,len()函数通常用于获取容器对象的元素个数,比如列表、字符串、字典等。通过实现__len__方法,我们可以自定义对象的长度,并使其适应于特定的应用场景。例如,如果我们定义了一个自定义的容器类,可以通过实现__len__方法来返回容器中元素的个数。这样,我们就可以像对待其他内置容器一样,使用len()函数来获取自定义容器对象的长度。

class MyList:
    def __init__(self):
        self.data = []

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

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

__getitem__(self, key)

获取对象的指定元素,可通过obj[key]来调用。并将键值key传递给它作为参数。

class MyList:
    def __init__(self):
        self.data = []

    def __getitem__(self, key):
        return self.data[key]

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

__setitem__(self, key, value)

设置对象的指定元素,通过重载该方法,可以实现通过obj[key] = value来调用该方法。

class MyList:
    def __init__(self):
        self.data = []

    def __setitem__(self, key, value):
        self.data[key] = value

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

__delitem__(self, key)

删除对象的指定元素,可通过del obj[key]来调用。当你想要从对象中删除特定的元素时,这个方法会非常有用。

class MyList:
    def __init__(self):
        self.data = []

    def __delitem__(self, key):
        del self.data[key]

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

__iter__(self)

返回一个可迭代对象,以便我们可以通过for item in obj的方式进行迭代。

class MyList:
    def __init__(self):
        self.data = []

    def __iter__(self):
        return iter(self.data)

my_list = MyList()
my_list.data = [1, 2, 3, 4, 5]
for item in my_list:
    print(item)  # 输出: 1 2 3 4 5

__next__(self)

返回迭代器的下一个元素,可通过next(obj)来调用。

class MyIterator:
    def __init__(self):
        self.data = [1, 2, 3, 4, 5]
        self.index = 0

    def __next__(self):
        if self.index >= len(self.data):
            raise StopIteration
        item = self.data[self.index]
        self.index += 1
        return item

my_iterator = MyIterator()
print(next(my_iterator))  # 输出: 1
print(next(my_iterator))  # 输出: 2
print(next(my_iterator))  # 输出: 3

__call__(self, ...)

将对象作为函数调用时触发,可通过obj(...)来调用。

class MyFunc:
    def __call__(self, x, y):
        return x + y

my_func = MyFunc()
result = my_func(3, 4)
print(result)  # 输出: 7

__eq__(self, other)

判断对象是否相等,可通过obj == other来调用。在Java中如果判断对象引用的话,你也需要重写equals这个方法。

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

    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

point1 = Point(1, 2)
point2 = Point(1, 2)
print(point1 == point2)  # 输出: True

__lt__(self, other)

判断对象是否小于另一个对象,可通过obj < other来调用。

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

    def __lt__(self, other):
        return self.x < other.x and self.y < other.y

point1 = Point(1, 2)
point2 = Point(3, 4)
print(point1 < point2)  # 输出: True

__gt__(self, other)

判断对象是否大于另一个对象,可通过obj > other来调用。

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

    def __gt__(self, other):
        return self.x > other.x and self.y > other.y

point1 = Point(3, 4)
point2 = Point(1, 2)
print(point1 > point2)  # 输出: True

__add__(self, other)

定义对象的加法操作,可通过obj + 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)

vector1 = Vector(1, 2)
vector2 = Vector(3, 4)
result = vector1 + vector2
print(result.x, result.y)  # 输出: 4 6

__sub__(self, other)

定义对象的减法操作,可通过obj - other来调用。

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

    def __sub__(self, other):
        return Vector(self.x - other.x, self.y - other.y)

vector1 = Vector(3, 4)
vector2 = Vector(1, 2)
result = vector1 - vector2
print(result.x, result.y)  # 输出: 2 2

常用特殊(魔术)方法的汇总一览表

以下是20个常用的特殊方法及其调用方式的表格,再多的用到了我们在看一下就可以了,只要记住(__)这个下划线开头和结尾的方法就可。请看下表:

特殊方法描述调用方式
__init__初始化对象obj = ClassName()
__str__返回对象的字符串表示str(obj)
__len__返回对象的长度len(obj)
__getitem__获取对象的元素obj[index]
__setitem__设置对象的元素obj[index] = value
__delitem__删除对象的元素del obj[index]
__contains__判断对象是否包含某个元素value in obj
__add__实现对象的加法obj1 + obj2
__sub__实现对象的减法obj1 - obj2
__mul__实现对象的乘法obj1 * obj2
__div__实现对象的除法obj1 / obj2
__eq__判断对象是否相等obj1 == obj2
__ne__判断对象是否不相等obj1 != obj2
__lt__判断对象是否小于obj1 < obj2
__gt__判断对象是否大于obj1 > obj2
__le__判断对象是否小于等于obj1 <= obj2
__ge__判断对象是否大于等于obj1 >= obj2
__iter__返回一个迭代器对象iter(obj)
__next__返回迭代器的下一个元素next(obj)
__del__对象销毁时调用del obj
__call__将对象作为函数调用obj()

总结

Python中的特殊方法(魔术方法)是由Python解释器自动调用的,用于实现对象的特定功能。常用的特殊方法包括__init____str____repr____len____getitem____setitem____delitem____iter____next____call__等。通过实现这些特殊方法,我们可以自定义对象的行为,使其更加符合我们的需求和预期。这些特殊方法的调用方式也有所不同,可以通过内置函数、运算符、迭代等方式来调用。掌握了这些特殊方法的用法,可以提高我们在Python中编写类和对象的灵活性和可扩展性。

以上就是一文带你探索Python中15个常见的魔术方法的详细内容,更多关于Python魔术方法的资料请关注脚本之家其它相关文章!

相关文章

  • NumPy实现ndarray多维数组操作

    NumPy实现ndarray多维数组操作

    NumPy一个非常重要的作用就是可以进行多维数组的操作,这篇文章主要介绍了NumPy实现ndarray多维数组操作,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 实例讲解Python中整数的最大值输出

    实例讲解Python中整数的最大值输出

    在本篇文章里小编给大家分享了关于Python中整数的最大值输出的实例内容,以及相关知识点,需要的朋友们学习下。
    2019-03-03
  • python中时间转换datetime和pd.to_datetime详析

    python中时间转换datetime和pd.to_datetime详析

    这篇文章主要给大家介绍了关于python中时间转换datetime和pd.to_datetime的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用python具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • Python3+Appium安装使用教程

    Python3+Appium安装使用教程

    这篇文章主要介绍了Python3+Appium安装使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • python中os.environ基本介绍及使用方法

    python中os.environ基本介绍及使用方法

    os.environ是Python中的一个字典对象,它包含了当前进程的环境变量,通过使用os.environ,可以获取和设置环境变量的值,这篇文章主要介绍了python中os.environ基本介绍及使用方法,需要的朋友可以参考下
    2023-08-08
  • Python如何发布程序的详细教程

    Python如何发布程序的详细教程

    Python是一种面向对象的解释型计算机程序设计语言,现在很多人都在使用,尤其是其跨平台特性及自然语言属性,获得很多人的钟情,那么如何把Python程序打包为Windows系统中的exe可执行程序呢
    2018-10-10
  • python list count统计个数的实现

    python list count统计个数的实现

    这篇文章主要介绍了python list count统计个数的实现方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 使用python3批量下载rbsp数据的示例代码

    使用python3批量下载rbsp数据的示例代码

    这篇文章主要介绍了使用python3批量下载rbsp数据的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Python中一些自然语言工具的使用的入门教程

    Python中一些自然语言工具的使用的入门教程

    这篇文章主要介绍了Python中一些自然语言工具的使用的入门教程,本文来自于IBM官方网站技术文档,需要的朋友可以参考下
    2015-04-04
  • 使用Python进行图像裁剪的多种方法及代码示例

    使用Python进行图像裁剪的多种方法及代码示例

    这篇文章主要介绍了使用Python进行图像裁剪的多种方法,包括使用PIL库和OpenCV库,还提供了高级技巧和示例代码,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01

最新评论