声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2307|回复: 3

[Python] python一个有意思的函数标记

[复制链接]
发表于 2010-12-9 17:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
  1. def symbol(symb):
  2.         def decorator(func):
  3.                   func.symbol = symb
  4.                   return func
  5.      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链接在一起。
很有意思的一个定义!


评分

1

查看全部评分

回复
分享到:

使用道具 举报

发表于 2010-12-9 20:08 | 显示全部楼层
有一个地方不明白,语句:
  1. 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。

那么语句
  1. func.symbol = symb
复制代码

到底干了什么?居然能往特定的,已经创建出来的对象添加成员变量(或者叫属性)?
 楼主| 发表于 2010-12-9 22:08 | 显示全部楼层
可以看一下修饰器的作用,实质上看起来名字都是func实际上已经不是func那个函数了,修饰器重新定义了函数入口。我也没用过,刚看的呵呵!

点评

赞成: 5.0
赞成: 5
哦,“修饰器”。。。找找看看  发表于 2010-12-10 09:29
 楼主| 发表于 2010-12-9 23:01 | 显示全部楼层

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

In [30]: f.symbol
Out[30]: 'y'

In [31]: f(1,2)
Out[31]: 2
也许这样调用的方式更容易理解些,中间的func并不是我们认为的那个func
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-17 11:52 , Processed in 0.064542 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表