一段代码,告诉你什么是装饰器、可调用类、自定义运算符、函数式编程

本文通过一段代码展示了Python中的装饰器、可调用类、自定义运算符、函数式编程以及如何处理任意参数。代码中,F类实现了__call__和__gt__方法,使其既可作为装饰器使用,又可实现自定义的‘>’运算。通过F类装饰的add_two和divide_3_floor函数,演示了如何在链式运算中组合函数。同时,文章解释了Python中‘and’操作的返回逻辑。这段代码深入探讨了Python语言的高级特性,有助于提升对Python编程的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

你好,我是征哥,给你看一段有趣的代码,可以学习到装饰器、可调用类、自定义运算符、函数式编程、任意参数args 和 kwargs。

话不多说,先看代码:

38b92dd662542f074564e64881d494b8.png

要是你能一下子就看懂,那说明你已经是 Python 高手了。

要是没看懂,我来解说一下(我自己当时也是仔细研究了一番,才明白)。

首先 F 是一个类,这个类有三个魔法函数:

  • __init__ 这就是个普通的初始化函数,没啥特别的

  • __call__ 当一个实例/对象被当作函数调用时,这个函数会自动调用,比如 my_f = F() ,那么 my_f(*args,**kwargs) 时就会调用这个函数。这里 __call__ 返回的是一个函数,因此可以推断出 self.f 是一个可调用的函数。

  • __gt__ 这是个大于号的自定义运算符,当两个对象比较时,就会调用这个函数,比如说 a > b 就相当于调用 a.__gt__(b)

接下来,我们看到:

@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 
<object object at 0x7f800455fec0>
>>> y
<object object at 0x7f800455fec0>
>>> x
<object object at 0x7f800455ffe0>
>>>

因此 3 and '2' 返回的结果是 '2'。

你看明白了吗?

留言讨论

最后

本文通过一段有趣的代码,分享了装饰器、可调用类、自定义运算符、函数式编程、任意参数 args 和 kwargs 相关的知识,如果有收获,还请给个在看,分享给更多学习 Python 的朋友。

2c67764251b496f764f5293339403e3c.png

推荐阅读:说说 Python 的元编程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值