【发布时间】:2017-03-22 06:17:13
【问题描述】:
不使用
的 Python 装饰器@functools.wraps(function)
改变原来函数的__doc__,__name__,help,这可以理解为装饰器很简单
fun=decorate(fun)
但是为什么它不改变那个函数的 dir(fun) 呢?它不应该也改变吗?
例如:
def wow(func):
def __wow():
return func()
return __wow
@wow
def fun():
print "yes"
fun.b=1
print fun.__name__
print dir(fun)
输出是
__wow => name of decorator
[... '__sizeof__', '__str__', '__subclasshook__', 'b', 'func_closure', ...]
^^
如果你看到这里,当我们打印 name 时它是 decorator 但是当我们打印 dir 它的 fun 因为 b 在那里。那么为什么 b 在那里?把dir(decorator) 当作乐趣。name 是装饰者的名字
【问题讨论】:
-
您希望有什么不同?
-
@vks:您将属性 和
dir()应用于装饰结果。您只需在该对象上设置一个新属性,当然dir()将包含该属性。 -
我还要求你明确一点:你只是在
dir()中突出显示'b'。你没想到它会在那里吗?请解释输出有什么令人惊讶的地方以及原因。 -
函数是对象。您从装饰器返回了
__wow,因此Python 将该对象分配给fun。fun在这里只是一个名称,它引用了装饰器的结果。
标签: python python-2.7 decorator python-decorators