python 装饰器的原理

u012410874 2014-07-02 04:31:56
下面的程序为什么输出是错误的,求大神讲解下装饰器的基本原理,@deco到底做了什么,执行顺序等
不要讲
@deco
def foo():
pass
等于foo=deco(foo),要深入的原理!!!!
def deco_funcNeedDoc(func):
if func.__doc__ == None:
print func,'has no __doc__'
else:
print func,':',func.__doc__
return func
'''
def deco_funcNeedDoc(func):
def iner():
if func.__doc__ == None:
print func,'has no __doc__'
else:
print func,':',func.__doc__
func()
#return func
return iner
'''
@deco_funcNeedDoc
def f():
print 'f() do something'

@deco_funcNeedDoc
def g():
'I have a __doc__'
print 'g() do something'

f()
g()
...全文
249 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
u012410874 2014-07-11
  • 打赏
  • 举报
回复
突然有些理解了
水木神風 2014-07-10
  • 打赏
  • 举报
回复
和动态代理的思路差不多
林海 2014-07-09
  • 打赏
  • 举报
回复
#!/usr/bin/env python #coding:utf-8 def deco_funcNeedDoc(func): def new_f(): if func.__doc__ == None: print func,'has no __doc__' else: print func,':',func.__doc__ return func() return new_f @deco_funcNeedDoc def f(): print 'f() do something' @deco_funcNeedDoc def g(): 'I have a __doc__' print 'g() do something' f() g()
panghuhu250 2014-07-04
  • 打赏
  • 举报
回复
你希望的结果是怎么样?
u012410874 2014-07-04
  • 打赏
  • 举报
回复
为什么结果是这样。。。 谁能解释下
  • 打赏
  • 举报
回复
装饰器是 设计模式中装饰者模式的python实现 装饰器就类似于前键 与后键 Python的函数本身也是一个对象, 那么装饰器其实也就是一个函数,一个用来包装函数对象的函数, 返回一个修改之后的函数对象,将其重新赋值原来的标识符,并永久丧失对原始函数对象的访问。
angel_su 2014-07-02
  • 打赏
  • 举报
回复
看起来正常阿,如果不是你期望的输出的顺序,那就得改改deco_funcNeedDoc...
u012410874 2014-07-02
  • 打赏
  • 举报
回复
结果: <function f at 0x027B9D30> has no __doc__ <function g at 0x027B9D70> : I have a __doc__ f() do something g() do something

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧