首先理解python的函数
def base():
print('i am base')
print(type(base), base)
#<class 'function'> <function base at 0x03934150>
print(type(base()),base())
#i am base
#i am base
#<class 'NoneType'> None
python的函数名可以理解为指向一个内存单元的指针,而函数名()则为调用这个函数
def test():
return base()
def base():
print('i am base')
return "end"
print(test())
#1.调用test()
#2.返回base()的调用,执行base
#3.返回字符串“end"
def deco(func):
def wrapper():
print('我是装饰器')
return func()#这也是为什么内层要返回被装饰函数的调用
return wrapper
@deco
def test():
print("我是测试函数")
test()
#我是装饰器
#我是测试函数
装饰器的目的是在不改变原来函数的基础上增加的新的功能
假如现在我有多个测试函数,我想再测试它们的时候,给每一个函数标记一个顺序,这样方便查看
@deco
def test(): #标记1
#....执行事情
@deco
def test2(): #标记2
#....执行事情
@deco
def test3(): #标记3
#.....执行事情
很明显的是,我们在目前的装饰器内部,是无法知道每一个函数的序号,这意味着我们要把序号手动传进去
再次强调 装饰器不修改原函数
@deco
def test3(id = 3):#毫无疑问是错的,他改变了函数,而且id现在作为被装饰函数的参数,我们也无法调用它
#.....执行事情
因此,我们需要给装饰器本身传进去
然后我考虑给装饰器本身多加一个参数
def deco(func,num):#这里多了一个num,用来传进去序号
#打印num
def wrapper():
print('我是装饰器')
return func()
return wrapper
@deco
def test():
print("我是测试函数")
#不过这样不能执行。。。。。。我暂时不知道怎么解决
接下来是正统方法
def param(num):
def deco(func):
def wrapper():
print("当前序号",num)
print('我是装饰器')
return func()
return wrapper
return deco
@param('id1')
def test():
print("我是测试函数")
test()
#当前序号 id1
#我是装饰器
#我是测试函数
接下来就明白了! 所谓的 @name 就是函数名字,下面的函数就是它的参数!,它参数分为两种
1.@name() 即后面带括号,那么它的参数就是括号里面的东西
2.@name 不带括号 它的参数 就是下面的被装饰函数,且只有一个
def param(num,newfunc):
def deco(func):
def wrapper():
newfunc()
print("当前序号",num)
print('我是装饰器')
return func()
return wrapper
return deco
def other2():
print('我是other函数')
@param(3,other2) #传入了两个参数 一个num 和 函数
def test():
print("我是测试函数")
test()
#我是other函数
#当前序号 3
#我是装饰器
#我是测试函数