python一个有意思的函数标记
def symbol(symb):def decorator(func):
func.symbol = symb
return func
return decorator这个函数有意思哈,从最后的return decorator看,是返回的一个函数。比你运行之后在
>>x=symbol('x')
>>x
<function decorator at 0x01F8DC30>
>>f=lambda x,y:x+y
>>x(f)
<function decorator at 0x01F8DC30>
>>f.symbol
'x'
这样就把函数f与标记‘x'对应起来。首先运行symbol(’x')的时候只是定义了一个将要与一个函数(或者类)对应的一个
符号,实质上是一个函数就是哪个decorator函数,是函数的函数。然后x(f)就将f与符号x链接在一起。
很有意思的一个定义!
有一个地方不明白,语句:func.symbol = symb
为func对象添加了一个成员变量?
可以做这样的测试:
>>> f= lambda x,y:x+y
>>> f.symbol
Traceback (most recent call last):
File "<pyshell#2>", line 1, in <module>
f.symbol
AttributeError: 'function' object has no attribute 'symbol'
>>>
说明刚开始创建 f时,f 并没有成员变量symbol。
那么语句
func.symbol = symb
到底干了什么?居然能往特定的,已经创建出来的对象中添加成员变量(或者叫属性)?
可以看一下修饰器的作用,实质上看起来名字都是func实际上已经不是func那个函数了,修饰器重新定义了函数入口。我也没用过,刚看的呵呵!
In : f=symbol('y')(lambda x,y:x*y)
In : f.symbol
Out: 'y'
In : f(1,2)
Out: 2
也许这样调用的方式更容易理解些,中间的func并不是我们认为的那个func
页:
[1]