smtmobly 发表于 2010-12-9 17:11

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链接在一起。
很有意思的一个定义!


Rainyboy 发表于 2010-12-9 20:08

有一个地方不明白,语句: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
到底干了什么?居然能往特定的,已经创建出来的对象中添加成员变量(或者叫属性)?

smtmobly 发表于 2010-12-9 22:08

可以看一下修饰器的作用,实质上看起来名字都是func实际上已经不是func那个函数了,修饰器重新定义了函数入口。我也没用过,刚看的呵呵!

smtmobly 发表于 2010-12-9 23:01


In : f=symbol('y')(lambda x,y:x*y)

In : f.symbol
Out: 'y'

In : f(1,2)
Out: 2
也许这样调用的方式更容易理解些,中间的func并不是我们认为的那个func
页: [1]
查看完整版本: python一个有意思的函数标记