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

同名函数调用不会混淆么

def new_fn(f):
        def fn(x):

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

                return f(x)

        return fn

问题在:

@new_fn

def f(x):

        return x*2等价于

def f(x):

        return x*2

f = new_fn(f)

由于new_fn()是一个decorator,返回一个函数,所以原来的f函数仍然存在,只是现在的同名f = new_fn(f),指向了新的函数。于是调用f()将执行新函数,即在new_fn()函数中返回的fn()函数。fn()函数内,首先打印日志,再接着调用原始函数f()。问题是这个调用不会混淆原始的f()和新函数f()么?

正在回答

1 回答

def decorator(fun):
    def wrapper(*args, **kw):
        print("我是函数wrapper的命名空间:{}".format(dir()))
        print("我是wrapper里面的参数fun,我现在代表的函数是:{}".format(fun.__name__))
        return fun(*args, **kw)
    print("我是函数decorator的命名空间:{}".format(dir()))
    return wrapper


@decorator
def add(x, y):
    return x + y


print("我是主程序中的add,我现在的函数名是:{}".format(add.__name__))
print("我是主程序的命名空间:{}".format(dir()))
print(add(3, 5))
我是函数decorator的命名空间:['fun', 'wrapper']
我是主程序中的add,我现在的函数名是:wrapper
我是主程序的命名空间:['__builtins__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'add', 'decorator']
我是函数wrapper的命名空间:['args', 'fun', 'kw']
我是wrapper里面的参数fun,我现在代表的函数是:add
8
>>>

这是一段代码和运行结果,可以看见,在decorator函数的命名空间里面,压根就不存在add函数,而是fun函数。

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

艾小科 提问者

就是说 @decorator def add(x, y): return x + y相当于是 add = decorator(add) def add(x, y): return x + y 我再调用add就是经过装饰之后的add,decorator里形参fun还是指向原来的add。这个机制有点意思啊。。。
2016-08-15 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

同名函数调用不会混淆么

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