话不多说,先看代码:
站在用户的角度思考问题,与客户深入沟通,找到瑞丽网站设计与瑞丽网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:成都网站制作、网站设计、企业官网、英文网站、手机端网站、网站推广、域名注册、网页空间、企业邮箱。业务覆盖瑞丽地区。
要是你能一下子就看懂,那说明你已经是 Python 高手了。
要是没看懂,我来解说一下(我自己当时也是仔细研究了一番,才明白)。
首先 F 是一个类,这个类有三个魔法函数:
接下来,我们看到:
@F
def add_two(i):
return i+2
看到 @ 就要想到装饰器,类 F 实现了 __call__ 方法,因此可以当作装饰器。
装饰以后,add_two 就是类 F 的对象:
>>> add_two
<__main__.F object at 0x7f81cbaa7790>
>>>
add_two(i) 就相当于 F(add_two).__call__(i)
接下来的代码:
@F
def divide_3_floor(i):
return i // 3
仍然是一个被装饰的函数, 装饰以后 divide_3_floor 就是类 F 的对象
>>> divide_3_floor
<__main__.F object at 0x7f81cb8687f0>
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_floor and divide_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)) and str(divide_3_floor(7))
其实就是 :
>>> divide_3_floor(add_two(7)) and str(divide_3_floor(7))
'2'
>>> 3 and '2'
'2'
>>>
Python 里面 A and B 返回的总是 B:
>>> x = object()
>>> y = object()
>>> x and y
因此 3 and '2' 返回的结果是 '2'。
你看明白了吗?
当前标题:一段代码,告诉你什么是装饰器、可调用类、自定义运算符、函数式编程
转载来于:http://www.csdahua.cn/qtweb/news32/227932.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网