网易首页 > 网易号 > 正文 申请入驻

一日一技:8行炫技代码,知识点多得不得了

0
分享至

我们今天来看一段炫技代码。它可以把任何能接收两个参数的函数定义成一个特殊的运算符。

例如,我们知道Python里面的range函数,最少可以接收1个参数,最多能够接收3个参数。当只有两个参数的时候,格式为range(开始, 结束),从开始数字到结束数字逐次加1,左闭右开。使用今天的方法,可以把它的写法改为开始 |到| 结束,如下图所示:

又比如,urllib.parse.urljoin可以把域名和一个相对路径拼接起来: urljoin(域名, 相对路径),我们也可以改写成如下图所示的格式:

这种炫技有余,实用不足的功能是怎么实现的呢?其实原理非常简单,只有8行代码:

class Test:
def __init__(self, num):
self.num = num
def __or__(self, other):
print(f'我右边有一个东西,它是:{other}')
x = Test(100)
x | 55

这里就涉及到一个盲点和两个真正的知识点。这个盲点就是,你可能以为 |到|是一个字符,但是它是3个字符;你可能会把|拼接|看做一个整体,但是它实际上是3个部分:左边的|、拼接和右边的|。

我们把空格加上,就很明显了:

两个真正的知识点,就是__or__和__ror__这两个魔术方法和偏函数partial。而Change本身就是一个普通的类而已,__or__和__ror__定义了这个类的实例在左侧遇到|时,右侧遇到|时的具体行为。

我们一个一个来讲。首先是__or__。它定义了实例的右侧遇到|时的具体行为。例如,我们用一个简单的代码来进行测试:

class Test:
def __init__(self, num):
self.num = num
def __or__(self, other):
print(f'我右边有一个东西,它是:{other}')
x = Test(100)
x | 55

运行效果如下图所示:

但如果你把竖线放在左边,它就会报错,如下图所示:

而__ror__就是用来定义|在实例左边的时候,它的行为:

所以,我们最开始的例子中,2 |到| 10,实际上应该理解为:

  1. 到是Change(range)返回的实例
  2. 2 | 到 生成一个中间对象,我们假设它是x
  3. x | 10 生成结果

在我们演示的例子中,2 | 到首先进入了Change类的__ror__方法中:

def __ror__(self, other):
self.func = partial(self.func, other)
return self

其中,一开始的self.func就是我们在初始化实例Change(range)时传入的参数range。所以partial(self.func, other)等价于partial(range, 2)。关于偏函数partial,大家可以看我这篇文章:偏函数:在Python中设定默认参数的另一种办法。简单来说,使用偏函数,可以给一个真正的函数传一部分参数,过一会再补剩下的参数。

可能大家在日常的开发者,很少会让一个实例方法返回self。关于这个写法,大家可以看我的这一篇文章:一日一技:在Python里面实现链式调用。也就是说,1 | 到返回的,依然是Change类的一个实例,我们简称它为x。这个实例的属性self.func的值是partial(range, 2)。

接下来,x | 10,调用的是__or__方法,于是,此时执行的是partial(range, 2)(10)。偏函数的参数补全了,于是它里面的range真正运行了起来,成为了range(2, 10)。

至此,这个Change类我们就解析透了。大家知道,在Python里面,魔术方法是有很多的,如果你不想用|,你还可以用其它的,例如:

或者:

或者:

同时,这个Change类,你甚至可以直接当做装饰器来使用。任何能够接收两个参数的函数,都能使用这个装饰器。例如:

最后总结一下。大家都知道,我是非常反对在工作代码中炫技的,因为炫技的写法很难读,很难维护。今天这个炫技的方法,虽然我也不推荐大家用在工作中,但是它短短8行代码里面,包含了很多个知识点,这就值得大家玩一玩了。

来源: 未闻Code

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
中将宗顺留在京突然去世,两女儿定居美国并已生育,死前照流出

中将宗顺留在京突然去世,两女儿定居美国并已生育,死前照流出

求实者
2024-06-07 23:14:05
汪峰接一双儿女成都过端午节!醒醒主动求抱,儿子好奇到四处张望

汪峰接一双儿女成都过端午节!醒醒主动求抱,儿子好奇到四处张望

裕丰娱间说
2024-06-08 12:45:38
吴镇宇带儿子费曼助阵《谈判专家》路演现场,我却笑死在评论区!

吴镇宇带儿子费曼助阵《谈判专家》路演现场,我却笑死在评论区!

知了娱乐
2024-06-07 17:25:32
詹姆斯欣赏伯德60分集锦:看对手替补席反应 拉里-传奇是之一

詹姆斯欣赏伯德60分集锦:看对手替补席反应 拉里-传奇是之一

直播吧
2024-06-07 17:32:21
2014年,印度商人为了庆祝45岁生日,穿4公斤黄金打造的纯金衬衫

2014年,印度商人为了庆祝45岁生日,穿4公斤黄金打造的纯金衬衫

茅舍品史
2024-06-01 23:40:02
闹大了!高考作文要求写互联网和人工智能,网友:高三不允许上网

闹大了!高考作文要求写互联网和人工智能,网友:高三不允许上网

请叫我教育君
2024-06-07 18:19:27
“一丝不挂”新舞蹈?惹争议,被摸下体更不害臊,金星质疑是对的

“一丝不挂”新舞蹈?惹争议,被摸下体更不害臊,金星质疑是对的

吃鱼思故渊
2024-05-16 21:48:21
关键的路走错了,就回到50年前

关键的路走错了,就回到50年前

历史与财经
2024-06-08 13:37:39
1亿,耻辱性报价!利物浦欲1换1,再求皇马神锋,英超5豪门哄抢

1亿,耻辱性报价!利物浦欲1换1,再求皇马神锋,英超5豪门哄抢

叁炮体育
2024-06-08 11:32:33
比“5.17”更猛的房贷政策,终于来了…

比“5.17”更猛的房贷政策,终于来了…

大碗楼市
2024-06-08 08:00:15
乔布斯好不容易取消的物理键盘,又被这家公司加回来了

乔布斯好不容易取消的物理键盘,又被这家公司加回来了

硅星人
2024-06-08 10:09:33
俄罗斯黑海舰队再遇袭!乌军击沉多艘船只

俄罗斯黑海舰队再遇袭!乌军击沉多艘船只

项鹏飞
2024-06-07 17:09:12
笑死!巴基斯坦成为全球航天强国,网友纷纷调侃:把日本嘲讽坏了

笑死!巴基斯坦成为全球航天强国,网友纷纷调侃:把日本嘲讽坏了

有趣的羊驼
2024-06-07 16:03:17
凡尔赛了,鲁尼调侃理查兹:他英超50场都要在中餐厅庆祝一番

凡尔赛了,鲁尼调侃理查兹:他英超50场都要在中餐厅庆祝一番

懂球帝
2024-06-08 13:14:06
中国互联网产业已被美国甩开!华为一年营收≈谷歌一季营收,卷价格不卷研发是种病态

中国互联网产业已被美国甩开!华为一年营收≈谷歌一季营收,卷价格不卷研发是种病态

老郭在学习
2024-06-07 23:42:40
墨西哥才刚选出女总统女市长拒绝黑帮接管警力遭公开「处决」

墨西哥才刚选出女总统女市长拒绝黑帮接管警力遭公开「处决」

孤独的独角兽影视
2024-06-08 09:10:03
一干部被查,涉嫌严重违纪违法

一干部被查,涉嫌严重违纪违法

锡望
2024-06-07 22:17:32
北大天才“韦神”被嘲:都32岁了还无房无车,看完工资网友沉默了

北大天才“韦神”被嘲:都32岁了还无房无车,看完工资网友沉默了

妍妍教育日记
2024-06-04 17:36:28
刚刚,国家最新定调房地产,释放6个信号,该怎么做都定了

刚刚,国家最新定调房地产,释放6个信号,该怎么做都定了

光宇吐楼市
2024-06-07 23:00:17
只差官宣,恩比德空降,哈登签约,两名核心离队,冲首冠!

只差官宣,恩比德空降,哈登签约,两名核心离队,冲首冠!

篮球迷聚集地
2024-06-08 14:13:31
2024-06-08 15:50:44
TaskBuilder
TaskBuilder
分享前端干货
53文章数 547关注度
往期回顾 全部

科技要闻

今年数学到底有多难?大模型:我也不太会

头条要闻

连续15年护考的警察目送女儿进考场 对女儿背影挥手

头条要闻

连续15年护考的警察目送女儿进考场 对女儿背影挥手

体育要闻

她拯救了WNBA,却为何被疯狂针对?

娱乐要闻

汤唯抵达巴黎将担任奥运火炬手

财经要闻

重磅详解:为什么美国经济还没有衰退?

汽车要闻

上汽大通大家9售26.99万起 综合续航1300km+

态度原创

家居
房产
数码
本地
公开课

家居要闻

柔和婉转 让阳光洒满空间

房产要闻

顶流地段+顶级户型!香港半山豪宅,已成为高净值人群的资产压舱石!

数码要闻

华硕 ROG 宣布购买指定产品,可申领《黑神话:悟空》游戏兑换码

本地新闻

我和我的家乡|踏浪营口,心动不止一夏!

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版