一段代码,告诉你什么是装饰器,可调用类,自定义操作符,函数式编程,自定义操作符,函数式编程,任意参数args和kwargs。话不多说,先看代码:如果你能一下子看懂,说明你已经是Python高手了。如果你不明白,让我解释一下(我自己仔细研究了一下才明白)。首先,F是一个类,这个类有3个神奇的函数:__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>bandb>c,而不是(a>b)>c,可以参考Python的链式运算竟然可以这样。让我为您扩展它: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))和str(divide_3_floor(7))实际上是:>>>divide_3_floor(add_two(7))andstr(divide_3_floor(7))'2'>>>3and'2''2'>>>Python中的A和B总是返回B:>>>x=object()>>>y=object()>>>xandy
