python装饰器(一)

一、 基础

在了解装饰器时,首先我们要复习一下装饰器会用到的基础知识

1. 函数本身与函数调用区别(foo与foo()区别)
def foo():
    print("hello world")


>>> s = foo              # 将函数本身去赋值给s
>>> type(s)           #我们去查看s类型,是一个函数类型
<class 'function'> 
>>> s()                  # 而且s是和foo本身一样,具有执行函数的功能
hello world         

>>> s2 = foo()       # 将foo函数执行结果赋值给s2,而在这里foo函数已经被执行
hello world 
>>> print (s2)         # 而我们看我们定义的函数,并没有返回值,所以S2什么都没有(None)
None              
2. 当有多个重名函数时,Python是把后定义的覆盖之前定义的
def foo():
  print("hello")

def foo():
  print("world")

>>> foo()
world

二、装饰器

首先我们了解下装饰器是个什么功能
装饰器主要功能就是给已经写好的模块,函数增加一些功能,但是不改变原有模块代码

# 装饰器
def outer(func):
    def inner(*args, **kwargs):
        print('log')
        ret = func(*args, **kwargs)
        print('end')
        return ret
    return inner

@outer
def f1(arg,arg3):
    print(arg,arg3)
    return  'xx'

>>> f1(2,3)
log
2 3
end
'xx'

# 装饰器使用
# @ + 函数名
# 功能:
#       1. 自动执行outer函数并且将其函数名f1当其参数传递
#       2. 将outer函数的返回值,重新赋值给f1
# 按照上例,@符省略了一系列的动作,我们把@符号摘出来,代码就是这样的
# 伪装饰器

def outer(func):
    def inner(*args, **kwargs):
        print('log')
        ret = func(*args, **kwargs)
        print('end')
        return ret
    return inner

def f1(arg,arg3):
    print(arg,arg3)
    return  'xx'

f1 = outer(f1)  #
f1(2,3)  #
# output:

  log
  2 3
  end
  'xx'


# 特别注意我这里函数有没有括号(被不被调用) # 其实就两个重要部分 # ①. 将函数以参数方式传入outer函数中,并将outer返回值重新赋给f1 # - 而outer返回值为嵌套的inner(注意代码中也没有括号),f1 = inner # ②. 重新执行被“装饰”过的f1函数
# 装饰器的@符仅仅做了①的操作,而我们真正实现“装饰”操作的还是做了一个巧妙地嵌套函数(outer),
# 它的主要功能就是以上的亮点,结合装饰器和我的“伪装饰器”代码,多次对比很容易看的懂

 

posted @ 2016-05-31 21:53  Cool_King  阅读(185)  评论(0编辑  收藏  举报