Python魔法方法详解:理解__call__、__add__、__str__、__len__、__init__等常见魔法方法及其含义
目录
1. 前言
2. +号的本质(引入)
3. 一些常见的魔法方法
3.1 各类运算符代表的魔法方法(可用于重载)
3.2 类的初始化与销毁__init__与__del__
3.2 关于类的一些属性的魔法方法
4. 用一些常见的魔法方法编写一段程序
5. 总结
1. 前言
在Python的广袤世界里,魔法方法犹如一颗颗璀璨的星辰,镶嵌在面向对象编程的天幕之上。它们是Python赋予类的一种神奇力量,让类具备了更多“魔法”般的能力,使代码更加简洁、优雅且功能强大。本文通过通俗易懂的方法重点介绍了魔法方法的基本概念及许多常用的魔法方法。
2. +号的本质(引入)
print(1+1)
print('a'+'b')
结果为:
这是一个简单得不能再简单的语句,但是你应该要知道,为什么python和人一样知道+号代表什么运算,面对不同的数据类型时+又能清楚地知道该如何输出结果。
实际上python在检测到+时,调用了__add__这个方法,而这种形式的方法被称为魔法方法。例如,调用以下程序仍然可以实现上述功能:
print(a.__add__(1))
print('a'.__add__('b'))
看到这里你应该就有个基本的概念了,可以说python中,万物皆对象,万物皆函数。
3. 一些常见的魔法方法
3.1 各类运算符代表的魔法方法(可用于重载)
基本运算符:通过实现 __add__
、__sub__
、__mul__
、__truediv__
等方法,可以让类支持加法、减法、乘法、除法等基本运算符。这样,对象之间就可以像基本数据类型一样进行数学运算,极大地增强了类的灵活性和可操作性。
比较运算符:__eq__
、__ne__
、__lt__
、__gt__
、__le__
、__ge__
等方法用于重载等于、不等于、小于、大于、小于等于、大于等于等比较运算符。它们使得对象能够在各种比较场景中正确地判断彼此之间的关系。
原地运算符:__iadd__
、__isub__
、__imul__
、__itruediv__
等方法用于实现原地运算符(如 +=
、-=
、*=
、/=
)。这些方法允许对象在执行运算后直接修改自身的状态,而无需创建新的对象,从而提高效率。
3.2 类的初始化与销毁__init__与__del__
__init__
:当对象被创建时,__init__
方法会自动调用,用于初始化对象的属性。它为对象赋予初始状态,是对象诞生时的第一声啼哭。例如,在文件处理类中,可以通过 __init__
方法打开指定的文件,为后续的操作做好准备。
__del__
:与 __init__
相对应,当对象即将被销毁时,__del__
方法会被调用。它通常用于释放资源,如关闭文件、断开网络连接等。这就好比是对象在离开舞台前的最后谢幕,确保一切善后工作都已妥善处理。
3.2 关于类的一些属性的魔法方法
__str__
:当使用 print()
函数打印对象,或者调用 str()
函数将对象转换为字符串时,__str__
方法会被触发。它的使命是返回一个易于用户理解的、简洁明了的字符串表示,让对象能够以友好、直观的方式展示在用户面前。
__len__:__len__
方法用于定义对象的长度,当调用 len()
函数时会被触发。它为对象提供了一个衡量自身元素数量的尺度。
__call__
:当对象被当作函数调用时,__call__
方法会被执行。这使得对象具备了函数的特性,可以在需要的时候像函数一样被调用,为代码的设计和组织提供了更多的可能性。
__contain__:__contains__
方法用于判断某个元素是否包含在对象中,当使用 in
运算符时会被调用。这为对象提供了快速、便捷的成员检测能力。
__enter__和__exit__ :这两个方法使得对象能够作为上下文管理器使用,在 with
语句中发挥重要作用。__enter__
方法在进入上下文时被调用,通常用于获取资源;而 __exit__
方法在离开上下文时执行,负责释放资源。它们共同确保了资源的正确获取和释放,避免资源泄漏等问题。
4. 用一些常见的魔法方法编写一段程序
为了更方便理解魔法方法的便捷与作用,我编写了一段关于购物车逻辑的程序,实现了两个购物车之间的相加运算,打印购物车,通过调用类名向购物车里面添加物品,计算购物车内物品数量等功能,代码结合第3小节易理解,
class Orange_ShoppingCard:
def __init__(self,items):#items项是存放物品列表
self.items=items
def __add__(self, other_card):
new_card=Orange_ShoppingCard(self.items+other_card.items)
return new_card
def __str__(self):
return f"Cart{self.items}"
def __len__(self):
return len(self.items)
def __call__(self, item):
self.items.append(item)
cart1=Orange_ShoppingCard(["orange","banana"])
cart2=Orange_ShoppingCard(["apple","pear"])
cart2("strawberry")
cart3=cart1+cart2
print(cart3.items)
print(cart3)
print(len(cart3))
如果能看懂这串最基本的代码,那么恭喜你魔法方法已经入门了。
5. 总结
Python的魔法方法宛如一把神奇的钥匙,为我们打开了面向对象编程的宝藏之门。它们赋予了类以生命的活力,让类能够以更加自然、直观的方式与世界交互。通过巧妙地运用魔法方法,我们可以创造出功能强大、结构优雅的类,使代码更具可读性、可维护性和可扩展性。
在Python的编程之旅中,深入理解和灵活运用魔法方法,将是我们迈向大师之路的重要一步。我是橙色小博,关注我,希望和大家一起学习,一起进步,后续还会有更多分享。
作者:橙色小博