badaoqingchen 发表于 2017-5-11 15:16:53

谁来解惑

def external_function(i, j):
    k = i - j
    def decorator(func):
      def wrapper(*arg):
            print 'this func is %s'%(func.__name__)
            print k * func(*arg)
      return wrapper
    return decorator

@external_function(10,5)
def my_func(x,y):
    return x + y

if __name__ == '__main__':
    my_func(10, 2)

哪位大神给讲讲这个装饰器,里面的函数是怎么调用的, my_func(10, 2)怎么调用的external_function( )

当回首遇上转身 发表于 2017-5-11 21:47:14

本帖最后由 当回首遇上转身 于 2017-5-11 21:50 编辑

my_func(10, 2)并没有调用external_function( ),而是调用my_func(x,y)返回 10+2 。
中间位置的external_function(10,5)为什么前面会有@?
external_function(10,5)本来是调用external_function(i,j )
你这段代码应该还不完整
不然很多地方是会报错的,没有声明,最好是发完整的代码
不然很难分析

yongxi 发表于 2017-5-11 23:54:43

我也是初学者 以下是我的看法:

            print k * func(*arg)
这一段应该就报错了。
首先 K是上层函数定义过 K = i - j , 这内嵌函数里面 如果不加 nonlocal k 指明 k 不是一个局部变量, 那么程序报错 说不知道k是什么。 除非这样 程序认为是一个字符串‘k’
其次,func(*arg)也不对。   func(*arg) 语法是一个函数? 但是 你提供的代码里面并没有 func的定义过程,只是在def decorator(func): 被定义为一个变量。 但是妇因为内嵌函数的关系,所以func在def wrapper(*arg):这一层内嵌函数里面是没有被定义过的 。
@external_function(10,5)调用函数为何要加一个@? 这个我也没看懂
所以,经过我有限的知识 分析,你这一段代码应该是错的。

经过运行, python第一时间就报错了。 报错位置是print 'this func is %s'%(func.__name__) 这一段的第二个引号。 说明语法已经错误。

第一时间没看出来{:10_306:}   。 哎。。
共同努力!

badaoqingchen 发表于 2017-5-12 13:35:09

当回首遇上转身 发表于 2017-5-11 21:47
my_func(10, 2)并没有调用external_function( ),而是调用my_func(x,y)返回 10+2 。
中间位置的external_ ...

这就是全部的代码了

badaoqingchen 发表于 2017-5-12 13:36:38

yongxi 发表于 2017-5-11 23:54
我也是初学者 以下是我的看法:

            print k * func(*arg)


这是我学装饰器的时候看到的代码。。。这就是全部了

当回首遇上转身 发表于 2017-5-12 13:43:25

sorry没用过装饰器,你可以参考一下这篇文章
http://blog.csdn.net/Sean_ran/article/details/52097997

badaoqingchen 发表于 2017-5-12 16:24:01

当回首遇上转身 发表于 2017-5-12 13:43
sorry没用过装饰器,你可以参考一下这篇文章
http://blog.csdn.net/Sean_ran/article/details/52097997

3Q
页: [1]
查看完整版本: 谁来解惑