一文了解 Python 的 “Magic” 方法
在以前的文章中,我聊过了Python的 getitem 和 setitem 方法。这些方法被称为“魔法”方法、特殊方法或者dunger方法(译者:国内书籍用“魔法”一词较多)。那么,什么是魔法方法呢?这正是今天我们要说的内容。
P.S.你会再一次的深深的爱上Python语言。
也将是一篇较长的文章,来让我们开始。
魔法方法究竟是什么?
魔法方法是一种具有特殊魅力的正常方法。Python通过这些魔法方法可以赋予你的class魔力。这些魔法方法都是以双下划线(__)作为前缀和后缀。坦率的讲,其实这些方法并没有什么魔法,另外这些方法这Python的文档中也没有较为详细的介绍,因此,今天我们就来详细的看一看这些方法。
魔法方法之初始化
所有的Python开发者都知道,init()是一个类(class)的第一个方法,也可以叫做构造函数。虽然,init()方法是第一个被创建的,但是它却不是第一个被调用的执行的,new()方法才是最早被调用的方法。
- new()方法:先读取参数,如:类名称,args,和kwargs。然后,new()方法把这些参数传递给对类名称的__init__()方法。 语法:new(class_name, args, kwargs)
- init()方法:是类的初始化方法或构造方法,这也几乎用于全局的初始化目的。 语法:init(self, args, kwargs)
- del()方法:类的析构函数。切记,这并不是定义del x,而是定义了一个对象被垃圾回收的行为。 语法:del(self)
看一个例子:
class SimpleInit(object):
'''
Class to initialize a list with a value
'''
def __init__(self, value=10):
self._list = [value]
def __del__(self):
del self._list
魔法方法之算术运算
算术运算是非常常见的,因此,如果你想创建属于自己的数据结构,魔法方法会使你的实现更容易。例如:我们可以像这样,some_list + some_list2,实现Python的列表(list)拼接。类似这种的有趣行为,我们可以通过魔法方法的算术运算实现定义。
- add(self, other) 定义加法 (+)
- sub(self, other) 定义减法 (-)
- mul(self, other) 定义乘法 (*)
- floordiv(self, other) 定义整除法 (//)
- div(self, other) 定义浮点型除法 (/)
- mod(self, other) 定义取余模运算 (%)
- and(self, other) 定义按位与 (&)
- or(self, other) 定义按位或 (|)
- xor(self, other) 定义按位异或 (^)
- pow(self, other) 定义指数运算 (**)
- lshift(self, other) 定义按位左移 (<<)
- rshift(self, other) 定义按位右移 (>>)
例如:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class SimpleAdder(object):
def __init__(self, elements=[]):
self._list = elements
def __add__(self, other):
return self._list + other._list
def __str__(self):
return str(self._list)
a = SimpleAdder(elements=[1,2,3,4])b = SimpleAdder(elements=[2, 3, 4])print(a + b) # [1, 2, 3, 4, 2, 3, 4]
魔法方法之增量赋值
Python不仅允许我们定义算术运算,也允许我们定义增量赋值运算。如果你不知道什么是增量赋值是什么?那么我们来看一个简单的例子:
x = 5
x += 1 # This first adds 5 and 1 and then assigns it back to 'x'
因此有的时候,你可能想写一些自自定义逻辑实现增量赋值操作。魔法方法支持的运算符有:
- iadd(self, other) 定义加法 (+=)
- isub(self, other) 定义减法 (-=)
- imul(self, other) 定义乘法 (*=)
- ifloordiv(self, other) 定义整除法 (//=)
- idiv(self, other) 定义浮点型除法 (/=)
- imod(self, other) 定义取模运算 (%=)
- iand(self, other) 定义按位与 (&=)
- ior(self, other) 定义按位或 (|=)
- ixor(self, other) 定义按位异或(^=)
- ipow(self, other) 定义指数运算 (**=)
- ilshift(self, other) 定义按位左移 (<<=)
- irshift(self, other) 定义按位右移 (>>=)
魔法方法之比较运算
Python有一组广泛的魔术方法实现比较。我们可以覆盖默认的比较行为,来定义使用对象的引用方法。下面是比较魔法方法的列表:
- eq(self, other) 帮助检查两个对象的相等。它定义了相等运算 (==)
- ne(self, other) 定义了不等运算 (!=)
- lt(self, other) 定义了小于运算 (<)
- gt(self, other) 定义了大于运算 (>)
- le(self, other) 定义了小于等于运算 (<=)
- ge(self, other) 定义了大于等于运算 (>=)
例如:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class WordCounter(object):
'''
Simple class to count number of words in a sentence
'''
def __init__(self, sentence):
# split the sentence on ' '
if type(sentence) != str:
raise TypeError('The sentence should be of type str and not {}'.format(type(sentence)))
self.sentence = sentence.split(' ')
self.count = len(self.sentence)
def __eq__(self, other_class_name):
'''
Check the equality w.r.t length of the list with other class
'''
return self.count == other_class_name.count
def __lt__(self, other_class_name):
'''
Check the less-than w.r.t length of the list with other class
'''
return self.count < other_class_name.count
def __gt__(self, other_class_name):
'''
Check the greater-than w.r.t length of the list with other class
'''
return self.count > other_class_name.count
word = WordCounter('Omkar Pathak')print(word.count)
魔法方法之类型转换
很多时候开发人员需要隐性的转换变量类型,来满足最要想要的结果。Python是关心你内在数据的类型的一种动态类型语言,除此之外,Python也关心你,哈哈!如果你想要自定义属于自己的方法,可以借助如下方法:
- int(self) 定义类型转化为 int
- long(self) 定义类型转化为 long
- float(self) 定义类型转化为 float
- complex(self) 定义类型转化为 complex(复数)
- oct(self) 定义类型转化为 octal(八进制)
- hex(self) 定义类型转化为 (十六进制)
- index(self) 定义类型转化为一种int, 当对象被用于切片表达式( a slice expression)时
最常用的魔法方法
这里有一些魔法方法你应该经常遇到:
- str(self) 定义了str()行为。例如,当你调用print(object_name),无论object_name是什么都会被__str__()执行
- repr(self) 定义了repr()行为。这个很大程度上类似于__str__()。这两个之间的主要区别是,str()主要是人类可读的和repr()是机器可读的
- hash(self) 定义了行为调用hash()
- len(self) 返回容器的长度
- getitem(self) 和 setitem(self). 更多内容可以详见我以前的博客文章。
- delitem(self, key) 定义了一个删除一个项目的行为. 例如, del _list[3]
- iter(self) 返回一个迭代容器
class CustomList(object):
def __init__(self, elements=0):
self.my_custom_list = [0] * elements
def __str__(self):
return str(self.my_custom_list)
def __setitem__(self, index, value):
self.my_custom_list[index] = value
def __getitem__(self, index):
return "Hey you are accessing {} element whose value is: {}".format(index, self.my_custom_list[index])
def __iter__(self):
return iter(self.my_custom_list)obj = CustomList(12)obj[0] = 1print(obj[0])print(obj)
把这些有魔法的Python礼物送给你!!
本文来自博客园,作者:I'm_江河湖海,转载请注明原文链接:https://www.cnblogs.com/jhhh/p/16763799.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本