前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python 中的魔法函数

Python 中的魔法函数

作者头像
星星在线
发布2021-01-04 14:58:17
8220
发布2021-01-04 14:58:17
举报
文章被收录于专栏:python爬虫实战之路

魔法函数是Python中的特性,学习好魔法函数将有助于我们写出优秀的pythonic(优雅的、地道的、整洁的)代码,同时因为Python语言的特性,我们在进行框架设计的时候除了设计模式等高级技能,魔法函数是必须使用的,因此学习好魔法函数是Python语言进阶的必经之路。下面我们就为大家介绍Python里的常用魔法函数。

常用魔法函数(非数学运算类型)

字符串表示

  • __repr__
  • __str__ 本来是写了一些例子来说明这两个函数,但是后来发现没什么用,我们在工作中用到的也就是打印显示print(item)和将对象转换为字符串str(item),因此没必要占用这么大的篇幅,这里简单说一下需要注意的用法。 如果我们在一个类中同时定义了__str__和__repr__函数,print和str函数会调用__str__,但是如果对象在列表内,打印时始终会调用__repr__,如果只定义了__repr__,那么print、str都会调用__repr__,所以强烈建议在写类的时候,如果需要格式化输出,那么一定要定义一个__repr__函数。

集合序列相关

__len__

__getitem__

__setitem__

__delitem__

结合上面的代码和输出结果可以知道,这三个函数就是把我们的对象变成可切片操作的对象,我们可以使用Python所支持的各种切片操作

__contains__

这将使我们能使用in操作符来判断取值是否在对象中,而不是写一个函数去调用

迭代相关

__iter__

__next__

代码语言:javascript
复制
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
代码语言:javascript
复制
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
代码语言:javascript
复制
from collections.abc import Iterator

print(isinstance(company, Iterator))

可调用

__call__

你没看错,这就是最简单的一个装饰器,装饰器的本质就是一个调用对象返回了一个可调用对象,一定要记住这一句。函数本身是一个可调用对象,如果返回一个可调用对象,那么它就是装饰器。你记住了上面那一句,我们再来看一下下面的例子:

代码看起来很简单,注释很懵逼,实际上你只要记住装饰器的本质就行了,这有助于我们实现更复杂的装饰器,万变不离其宗嘛。

with上下文管理器

__enter__

__exit__

从输出可以看出,即使内部执行报错,申请和释放总是会被执行,但是要注意在__enter__和__exit__函数中一定不能出错

数值转换

__abs__

__bool__

__int__

__float__

__hash__

报错告诉我们list不是一个可哈希的类型,大家应该知道在Python中,字典的键必须是一个可哈希的对象,因为Python中的字典背后的实现是采用的哈希表,但是list对象是不能哈希的,自然就报错了,下面我们做一下修改:

奇迹的发现,list可以作为键了,因为我们重载了list,实现了哈希函数,这样就满足了字典的要求

还有一些其他的魔法函数,我们下次再总结,Python中的魔法函数非常多,我们不需要全部记下,大概有个印象就可以了。记住几个常用的模块:属性、元类、集合序列、上下文

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python爬虫实战之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常用魔法函数(非数学运算类型)
    • 字符串表示
      • 集合序列相关
        • 迭代相关
          • 可调用
            • with上下文管理器
              • 数值转换
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档