- 函数可以当作一个变量
- 函数的参数也可以是函数
- 函数是可以嵌套的
def f():
print("hello")
per=f()
per
def f2(a):
return a
f2(f())
def f3():
def f4():
return ('hello f4')
return f4()
f3()
- 封闭:对已实现的功能代码尽可能的不要做修改。
- 开放:对现有的功能代码可扩展
- 需求:在调用f1 or f2函数的时候,先打印python自动化测试实战,再打印其他。
def getInfo(func):
def inner():
print('python自动化测试实战')
func()
return inner
@getInfo
def f1():
print('网易云课堂')
@getInfo
def f2():
print('51CTO的平台')
f1()
1,执行getinfo函数的时候,把被装饰的函数f1当作参数来传递
2,getinfo函数的返回值会重新赋值
3,一旦结合了装饰器后,调用f1的函数其实执行的是inner函数的内部,原来的函数f1被覆盖
4,被装饰的函数f1重新赋值给装饰器的内层函数Inner
def login1(func):
def inner(token='123456'):
if token=='123456':
return func(token)
else:
return '请登陆系统'
return inner
@login1
def profile1(token):
return '你的主页信息'
print(profile1('123456'))
在函数中添加装饰器
def logit(logfile='out.log'):
def logging_decorator(func):
#@wraps(func)
def wrapped_function(*args,**kwargs):
log_string=func.__name__+' was called'
print(log_string)
with open(logfile,'a') as opened_file:
opened_file.write(log_string+'\n')
return func(*args,**kwargs)
return wrapped_function
return logging_decorator
@logit()
def myfunc1(a):
pass
myfunc1('a')
@logit(logfile='func2.log')
def myfunc2():
pass
myfunc2()
#装饰器类
from functools import wraps
class logit(object):
def __init__(self,logfile='out.log'):
self.logfile=logfile
def __call__(self, func):
@wraps(func)
def wrapped_function(*args,**kwargs):
log_string=func.__name__+' was called'
print(log_string)
with open(self.logfile,'a') as opened_file:
opened_file.write(log_string+'\n')
self.notify()
return func(*args,**kwargs)
return wrapped_function
def notify(self):
pass
@logit()
def myfunc1():
pass
myfunc1()
#给logit创建子类,来添加email的功能
class email_logit(logit):
def __init__(self,email='admin@myproject.com',*args,**kwargs):
self.email=email
super(email_logit,self).__init__(*args,**kwargs)
def notify(self):
pass