为了账号安全,请及时绑定邮箱和手机立即绑定

装饰器函数new_fn()的问题

def f1(x):

    return x*2

def new_fn(f):

    print('call'+f._name_+'()')

    return f

f1=new_fn(f1)

print(f1(5))


new_fn()里一定要嵌套一个fn()么?上面的代码实现的结果跟视频里有什么区别?



正在回答

3 回答

喔喔,我懂你的意思了(当时你的问题是直接跳转出来的,我不是刚好看这一节),现在回看了一下,知道你fn()的意思了,,,这里你这么写是可以得到一样结果的,不同的是我代码中new(f1)返回的是wrapper函数,而你返回的就是原函数f1函数,,,如果按你这么写的话,f1=new_fn(f1)中左边这个f1就可以是任意的变量了,比如,把后两行代码改为:m1=new_fn(f1)  print m1(5)结果还是一样的,这样就给程序增加了很多不确定性了,个人觉得还是按装饰器函数的标准写法比较好

0 回复 有任何疑惑可以回复我~
#1

慕神1935635 提问者

非常感谢!
2018-07-16 回复 有任何疑惑可以回复我~
#2

慕仔1472576 回复 慕神1935635 提问者

没搞懂,我觉得你说的有道理啊,装饰器作用就是对函数包装加上其他功能啊,f1=new_fn(f1) 这一句的实质就是 print 'call '+f.__name__+'()' return f(x) 这两句啊,为啥还要多加一件重复的外壳wrapper?这个 new_fn(f) 不就已经是外壳了吗? 求教。
2018-08-23 回复 有任何疑惑可以回复我~

你这样是无法使用@引用装饰器的,你可以试试然后理解一下

0 回复 有任何疑惑可以回复我~
def f1(x):
    return x*2
    
def new_fn(f):
    def wrapper(x):
        print 'call '+f.__name__+'()'
        return f(x)
    return wrapper
f1=new_fn(f1)
print f1(5)

对于你第一个问题: new_fn()里一定要嵌套一个fn()么?我觉得你表达得有点问题,new_fn是函数的名称,这个名称可以随便取的,哪来的fn(),如果你fn是指f1的话,装饰器函数里肯定是要运行原函数的(就是这里的f1);你第二个问题:你代码有不少问题呢,,,装饰器函数是调用原函数,然后返回一个新函数,你代码里没有返回新函数呢,我把你的代码整理了一下,你再看看

1 回复 有任何疑惑可以回复我~
#1

慕神1935635 提问者

def f1(x): return x*2 def new_fn(f): print 'call '+f.__name__+'()' return f f1=new_fn(f1) print f1(5) 这个得到的结果跟你的代码得到结果一样啊。为什么还要再定义一个wrapper(x)呢?
2018-07-15 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
python进阶
  • 参与学习       255665    人
  • 解答问题       2949    个

学习函数式、模块和面向对象编程,掌握Python高级程序设计

进入课程

装饰器函数new_fn()的问题

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信