一段代码,告诉你什么是装饰器、可调用类、自定义运算符、函数式编程
你好,我是征哥,给你看一段有趣的代码,可以学习到装饰器、可调用类、自定义运算符、函数式编程、任意参数args 和 kwargs。
话不多说,先看代码:
要是你能一下子就看懂,那说明你已经是 Python 高手了。
要是没看懂,我来解说一下(我自己当时也是仔细研究了一番,才明白)。
首先 F 是一个类,这个类有三个魔法函数:
__init__这就是个普通的初始化函数,没啥特别的
__call__当一个实例/对象被当作函数调用时,这个函数会自动调用,比如 my_f = F() ,那么 my_f(*args,**kwargs) 时就会调用这个函数。这里 __call__返回的是一个函数,因此可以推断出 self.f 是一个可调用的函数。
__gt__这是个大于号的自定义运算符,当两个对象比较时,就会调用这个函数,比如说 a > b就相当于调用 a.__gt__(b)。
接下来,我们看到:
@Fdefadd_two(i): returni+2
看到 @ 就要想到装饰器,类 F 实现了 __call__方法,因此可以当作装饰器。
装饰以后,add_two 就是类 F 的对象:
>>>add_two<__main__.Fobjectat0x7f81cbaa7790>>>>
add_two(i)就相当于 F(add_two).__call__(i)
接下来的代码:
@Fdefdivide_3_floor(i): returni//3
仍然是一个被装饰的函数, 装饰以后 divide_3_floor 就是类 F 的对象
>>>divide_3_floor<__main__.Fobjectat0x7f81cb8687f0>
divide_3_floor(i)就相当于 F(divide_3_floor).__call__(i)
接下来的代码:
s=F(str)
说明 s 就是一个 F 的对象,s(i)就是 s.__call__(i),因为 self.f = str,因此,s.__call__(i)其实就是 str(i),可以将一个变量转化为字符串。
接下来的代码比较精彩:
f=add_two>divide_3_floor>s
要知道 a > b > c 是链式运算符,展开后是 a > b and b > c, 并不是 (a>b)>c,可以参考前文不可思议,Python 的链式操作竟然可以这样
这里的 f,我给你展开下:
f=add_two>divide_3_flooranddivide_3_floor>s
其中 add_two > divide_3_floor就会调用 add_two.__gt__(divide_3_floor)返回的就是函数:divide_3_floor(add_two(*args,**kwargs))。
同样的道理:divide_3_floor > s返回的是 str(divide_3_floor(*args,**kwargs))
因此 f(7) 就是 :
divide_3_floor(add_two(7))andstr(divide_3_floor(7))
其实就是 :
>>>divide_3_floor(add_two(7))andstr(divide_3_floor(7))"2">>>3and"2""2">>>
Python 里面 A and B返回的总是 B:
>>>x=object()>>>y=object()>>>xandy>>>y >>>x >>>
因此 3 and "2"返回的结果是 "2"。
你看明白了吗?
留言讨论
最后本文通过一段有趣的代码,分享了装饰器、可调用类、自定义运算符、函数式编程、任意参数 args 和 kwargs 相关的知识,如果有收获,还请给个在看,分享给更多学习 Python 的朋友。
相关阅读
-
世界热推荐:今晚7:00直播丨下一个突破...
今晚19:00,Cocos视频号直播马上点击【预约】啦↓↓↓在运营了三年... -
NFT周刊|Magic Eden宣布支持Polygon网...
Block-986在NFT这样的市场,每周都会有相当多项目起起伏伏。在过去... -
环球今亮点!头条观察 | DeFi的兴衰与...
在比特币得到机构关注之后,许多财务专家预测世界将因为加密货币的... -
重新审视合作,体育Crypto的可靠关系才能双赢
Block-987即使在体育Crypto领域,人们的目光仍然集中在FTX上。随着... -
简讯:前端单元测试,更进一步
前端测试@2022如果从2014年Jest的第一个版本发布开始计算,前端开发... -
焦点热讯:刘强东这波操作秀
近日,刘强东发布京东全员信,信中提到:自2023年1月1日起,逐步为...