1
sherlocktheplant 2016-09-01 20:05:29 +08:00
区别在于你的写法访问不到参数
|
2
sherlocktheplant 2016-09-01 20:08:36 +08:00 2
我的意思是你的装饰器里访问不到参数 比如 如果要求装饰器可以拦截或者篡改某些参数 你的写法做不到
|
3
kkzxak47 2016-09-01 20:13:29 +08:00 via Android
无参数装饰器可以像你那样写
|
4
Newyorkcity OP |
5
Newyorkcity OP |
6
fds 2016-09-01 20:19:11 +08:00
原来的 wrapper 可以记录或者修改 args kw
|
7
sherlocktheplant 2016-09-01 20:24:08 +08:00
@Newyorkcity
比如说 要求将所有传入被修饰函数的字符串全部变成大写 |
8
sherlocktheplant 2016-09-01 20:26:38 +08:00 1
第一层是用来接受修饰器本身的参数 第二层是接受被修饰的函数的引用 第三层是接受被修饰函数被调用时接受的参数
|
9
tmackan 2016-09-01 20:28:50 +08:00
|
10
junnplus 2016-09-01 21:54:26 +08:00
return func 之后,你的 f 函数的 s 参数并不会被返回的 func 接受
|
11
KDr2 2016-09-01 22:03:59 +08:00 1
楼上的诸位,难道不是楼主的第二种写法,只在代码加载时做了 log ,每次 call 的时候并不 log ?
|
12
firemiles 2016-09-01 22:39:19 +08:00
楼主你的 log 只是在定义时起作用输出一次,调用的时候跟没装 log 一样
|
13
sherlocktheplant 2016-09-01 22:48:13 +08:00
|
14
Newyorkcity OP |
15
firemiles 2016-09-01 23:00:12 +08:00 1
@Newyorkcity 你多屌用几次 f(5)试试,应该只能输出一次 log
|
16
firemiles 2016-09-01 23:00:29 +08:00
@Newyorkcity 你多调用几次 f(5)试试,应该只能输出一次 log
|
18
Newyorkcity OP @firemiles
是的,尝试了一下发现只有在第一次调用函数才会出现 call f() 然后教程的代码每次都会出现 call f() 可是请问这是为什么呢? 加上了装饰器的话不就令 f = log(text)(f)了么 那每次执行 f()都等于在自行 log(text)(f)()吧...为什么会出现之后的调用无效的问题呢 |
19
firemiles 2016-09-02 09:26:37 +08:00 1
@Newyorkcity 你装饰器返回的是原函数 `f = f`,不是 wrapper ,所以你的装饰器没有效果,例子多一层 'f = wrapper';
|
20
Newyorkcity OP @firemiles 大致懂了,谢谢~!
|
21
kamen 2016-09-02 11:46:22 +08:00 via Android
有一本 python 的书,对这些高级的用法讲得很详细,讲得也很浅明易懂,我当初看文档也是一脸懵逼,看了这本书就豁然开朗了,我记得 v2 有人翻译了这本书,放在了 gitbook
|
22
longchisihai 2016-09-02 12:37:17 +08:00
@kamen 啥书呀?能帮忙找找不?
|
23
kamen 2016-09-02 14:40:11 +08:00
你呀,还需要提高自身的姿势水平,我说这么多就是因为我当时不方便找,需要你自己用我的关键字去找。
Google 搜索 gitbook,点击 explore ,搜索 python ,以 most stars 排序,第一个是一看就是讲基础的,第二个一看就是讲高级用法的,然后就不用我说了吧。 |
24
Allianzcortex 2016-09-04 18:04:39 +08:00
好问题啊。 LZ 难道没有发现需要两层装饰器的都是以 fn 为参数,而需要三层装饰器的都是在第二个返回函数里以 fn 作为参数? decorator 和 decorator with arguments 是不同的思路,看这个: http://stackoverflow.com/questions/5929107/python-decorators-with-parameters
|
25
Allianzcortex 2016-09-04 18:05:36 +08:00
|