魔法函数是Python中的特性,学习好魔法函数将有助于我们写出优秀的pythonic(优雅的、地道的、整洁的)代码,同时因为Python语言的特性,我们在进行框架设计的时候除了设计模式等高级技能,魔法函数是必须使用的,因此学习好魔法函数是Python语言进阶的必经之路。下面我们就为大家介绍Python里的常用魔法函数。
__len__
__getitem__
__setitem__
__delitem__
结合上面的代码和输出结果可以知道,这三个函数就是把我们的对象变成可切片操作的对象,我们可以使用Python所支持的各种切片操作
__contains__
这将使我们能使用in操作符来判断取值是否在对象中,而不是写一个函数去调用
__iter__
__next__
class Company:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.data):
self.index = 0
raise StopIteration
else:
ret = self.data[self.index]
self.index += 1
return ret
company = Company(['Tom', 'Jenuy', 'Gua'])
print('第一次迭代')
for i in company:
print(i)
print('第二次迭代')
for i in company:
print(i)
# 输出
第一次迭代
Tom
Jenuy
Gua
第二次迭代
Tom
Jenuy
Gua
class Company:
def __init__(self, data):
self.data = data
self.index = 0
def __getitem__(self, item):
return self.data[item]
company = Company(['Tom', 'Jenuy', 'Gua'])
print('第一次迭代')
for i in company:
print(i)
# 输出
第一次迭代
Tom
Jenuy
Gua
第二次迭代
Tom
Jenuy
Gua
from collections.abc import Iterator
print(isinstance(company, Iterator))
__call__
你没看错,这就是最简单的一个装饰器,装饰器的本质就是一个调用对象返回了一个可调用对象,一定要记住这一句。函数本身是一个可调用对象,如果返回一个可调用对象,那么它就是装饰器。你记住了上面那一句,我们再来看一下下面的例子:
代码看起来很简单,注释很懵逼,实际上你只要记住装饰器的本质就行了,这有助于我们实现更复杂的装饰器,万变不离其宗嘛。
__enter__
__exit__
从输出可以看出,即使内部执行报错,申请和释放总是会被执行,但是要注意在__enter__和__exit__函数中一定不能出错
__abs__
__bool__
__int__
__float__
__hash__
报错告诉我们list不是一个可哈希的类型,大家应该知道在Python中,字典的键必须是一个可哈希的对象,因为Python中的字典背后的实现是采用的哈希表,但是list对象是不能哈希的,自然就报错了,下面我们做一下修改:
奇迹的发现,list可以作为键了,因为我们重载了list,实现了哈希函数,这样就满足了字典的要求
还有一些其他的魔法函数,我们下次再总结,Python中的魔法函数非常多,我们不需要全部记下,大概有个印象就可以了。记住几个常用的模块:属性、元类、集合序列、上下文。
本文分享自 python爬虫实战之路 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!