本文目录:

一、装饰器

二、装饰器修正1

三、装饰器修正2

四、装饰器语法糖

五、有参无参装饰器 

六、global与nonloal

一、装饰器

1 什么是装饰器

器=>工具
装饰=>指的是为被装饰对象添加新功能 装饰器本身可以是任意可调用的对象=>函数
被装饰的对象也可以是任意可调用的对象=>函数 目标:写一个函数来为另外一个函数添加新功能

2 为何要用装饰器

开放封闭原则: 软件一旦上线就应该对修改封闭,对扩展开放
对修改封闭:
1. 不能修改功能的源代码
2. 也不能修改功能的调用方式 对扩展开发:
可以为原有的功能添加新的功能 装饰器就是要在不修改功能源代码以及调用方式的前提下为原功能添加额外新的功能

3 如何用装饰器

import time

def index():
print('welcome to index page')
time.sleep(3) def outter(func):
# func=最原始那个index的内存地址
def wrapper():
start=time.time()
func() # 最原始那个index的内存地址()
stop=time.time()
print('run time is %s' %(stop-start))
return wrapper index=outter(index) #index=outter(最原始那个index的内地址) #index=wrapper函数的内地址
index() #wraper()

二、装饰器修正1

import time

def index():
print('welcome to index page')
time.sleep(3)
return 123 #==============================================================
def outter(func):
# func=最原始那个index的内存地址
def wrapper():
start=time.time()
res=func() # 最原始那个index的内存地址()
stop=time.time()
print('run time is %s' %(stop-start))
return res
return wrapper index=outter(index) #index=outter(最原始那个index的内地址) #index=wrapper函数的内地址
#============================================================== res=index() #res=wraper()
print(res)

三、装饰器修正2

import time

def index():
print('welcome to index page')
time.sleep(3)
return 123 def home(name):
print('welcome %s to home page' %name)
time.sleep(1) #==============================================================
def outter(func):
# func=最原始那个home的内地址
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print('run time is %s' %(stop-start))
return res
return wrapper index=outter(index) #index=outter(最原始那个index的内地址) #index=wrapper函数的内地址
home=outter(home) #index=outter(最原始那个home的内地址) #home=wrapper函数的内地址
#============================================================== home('egon') #wrapper('egon')
index() #wrapper()

四、装饰器语法糖

'''

# @装饰器的名字:要在被装饰对象正上方单独一行写上
import time
def timmer(func): # func=最原始那个home的内地址
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print('run time is %s' %(stop-start))
return res
wrapper.__doc__=func.__doc__ # 装饰对象的注释
wrapper.__name__=func.__name__ # 装饰对象的函数名称
return wrapper @timmer #index=timmer(index) ##index=timmer(最原始那个index的内地址) #index=wrapper函数的内地址
def index():
"""这是index功能"""
print('welcome to index page')
time.sleep(3)
return 123 @timmer #home=timmer(home) #index=timmer(最原始那个home的内地址) #home=wrapper函数的内地址
def home(name):
"""这是home功能"""
print('welcome %s to home page' %name)
time.sleep(1) # home('egon') #wrapper('egon')
# index() #wrapper() # print(help(index))
# print(help(home))
# print(index.__doc__) print(index.__name__)
''' from functools import wraps import time
def timmer(func): # func=最原始那个home的内地址
@wraps(func)
def wrapper(*args,**kwargs):
start=time.time()
res=func(*args,**kwargs)
stop=time.time()
print('run time is %s' %(stop-start))
return res
return wrapper @timmer
def index():
"""这是index功能"""
print('welcome to index page')
time.sleep(3)
return 123 @timmer
def home(name):
"""这是home功能"""
print('welcome %s to home page' %name)
time.sleep(1) print(help(index))
print(index.__name__) # 如果装饰器中的wrapper不写wrapper.__name__ = func.__name__ ,则返回warpper,否则返回被装饰对象的函数名称

五、有参装饰器

# 无参装饰器的模板
# def outter(func):
# def wrapper(*args,**kwargs):
# res=func(*args,**kwargs)
# return res
# return wrapper import time user_info={'current_user':None} def auth(func):
def wrapper(*args,**kwargs):
if user_info['current_user'] is not None:
res=func(*args,**kwargs)
return res
inp_user=input('username>>>: ').strip()
inp_pwd=input('password>>>: ').strip()
if inp_user == 'egon' and inp_pwd == '':
# 记录登录状态
user_info['current_user']=inp_user print('login successful')
res=func(*args,**kwargs)
return res
else:
print('user or password error')
return wrapper @auth
def index():
"""这是index功能"""
print('welcome to index page')
time.sleep(2)
return 123 @auth
def home(name):
"""这是home功能"""
print('welcome %s to home page' %name)
time.sleep(1) # index()
# home('egon') # 有参装饰器
def outter2(xxx,yyy):
def outter(func):
def wrapper(*args,**kwargs):
res=func(*args,**kwargs)
print(xxx)
print(yyy)
return res
return wrapper
return outter import time user_info={'current_user':None} def auth2(engine='file'):
def auth(func):
def wrapper(*args,**kwargs):
if user_info['current_user'] is not None:
res=func(*args,**kwargs)
return res
inp_user=input('username>>>: ').strip()
inp_pwd=input('password>>>: ').strip() if engine == 'file':
print('基于文件的认证')
if inp_user == 'egon' and inp_pwd == '':
# 记录登录状态
user_info['current_user']=inp_user print('login successful')
res=func(*args,**kwargs)
return res
else:
print('user or password error')
elif engine == 'mysql':
print('基于mysql数据的认证')
elif engine == 'ldap':
print('基于ldap的认证')
else:
print('无法识别认证源')
return wrapper
return auth @auth2(engine='mysql') # @auth ===> index=auth(最原始那个index的内存地址)===》index=wrapper
def index():
"""这是index功能"""
print('welcome to index page')
time.sleep(2)
return 123 @auth2(engine='file')
def home(name):
"""这是home功能"""
print('welcome %s to home page' %name)
time.sleep(1) index() #wrapper()
home('egon')

六、global与nonloal

# x=1
# def func():
# x=2
#
# func()
# print(x) # x=[]
# def func():
# x.append(1)
# x.append(2)
# x.append(3)
#
# func()
# print(x) # global: 在局部声明变量是全局变量
# x=1
# def func():
# global x
# x=2
#
# func()
# print(x) # nonlocal:在局部声明变量是外层函数的变量 x=333
def f1():
x=222
def f2():
x=111
def f3():
nonlocal x
x=0
f3()
print('f2内部的x: ',x)
f2()
print('这是f1内部的x: ',x) f1()
print(x)

python函数:装饰器、修正、语法糖、有参装饰器、global与nonlocal的更多相关文章

  1. day13 装饰器与语法糖

    day13 装饰器与语法糖 一.装饰器 1.什么是装饰器 装饰器就是装饰别人的工具,具体是指为被装饰者添加新功能 装饰器->函数 被装饰者->函数 2.为何要用装饰器 装饰器的核心思想:( ...

  2. Python基础之函数:2、globlal与nonlocal和闭包函数、装饰器、语法糖

    目录 一.global与nonlocal 1.global 2.nonlocal 二.函数名的多种用法 三.闭包函数 1.什么是闭包函数 2.闭包函数需满足的条件 3.闭包函数的作用 4.闭包函数的实 ...

  3. PYTHON-有参装饰器,无参装饰器,语法糖

    装饰器 装饰器就是闭包函数的一种应用场景 一 为何要用装饰器 #开放封闭原则:对修改封闭,对扩展开放 二 什么是装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强 ...

  4. javascript异步编程之generator(生成器函数)与asnyc/await语法糖

    Generator 异步方案 相比于传统回调函数的方式处理异步调用,Promise最大的优势就是可以链式调用解决回调嵌套的问题.但是这样写依然会有大量的回调函数,虽然他们之间没有嵌套,但是还是没有达到 ...

  5. Python学习——装饰器/decorator/语法糖

    装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...

  6. python中装饰器(语法糖)概念

    “”“” 什么是装饰器? """ 还是通过一个例子来慢慢说明 先看下面的例子 def func_1(x): return x*2 def fun_2(x): return ...

  7. python_装饰器_语法糖

    什么是高阶函数? -- 把函数名当做参数传给另外一个函数,在另外一个函数中通过参数调用执行 #!/usr/bin/python3 __author__ = 'beimenchuixue' __blog ...

  8. ES6深入浅出-3 三个点运算 & 新版字符串-1.函数与对象的语法糖

    主要讲的内容 时间充裕的话就讲,模板字面量 默认参数值 首先讲es6之前,我们是怎么做的.例如我们要写一个求和的函数, 请两个参数的和,但是如果有的人就是穿一个参数呢? 那么b没有传值,b的值是多少呢 ...

  9. for _ in range(n) python里那些奇奇怪怪的语法糖

    for _ in range(n)中 _ 是占位符, 表示不在意变量的值 只是用于循环遍历n次. 例如在一个序列中只想取头和尾,就可以使用_ 其实意思和for each in range(n)是一个意 ...

  10. Python基础之函数:3、多层语法糖、装饰器和装饰器修复技术及递归函数

    目录 一.多层语法糖 1.什么是多层语法糖: 2.多层语法糖用法: 二.有参装饰器 1.什么是有参装饰器: 2.有参装饰器的作用: 三.装饰器修复技术 1.什么是装饰器修复技术: 四.递归函数 1.什 ...

随机推荐

  1. 基于Scrapy框架的增量式爬虫

    概述 概念:监测 核心技术:去重 基于 redis 的一个去重 适合使用增量式的网站: 基于深度爬取的 对爬取过的页面url进行一个记录(记录表) 基于非深度爬取的 记录表:爬取过的数据对应的数据指纹 ...

  2. 在java开发环境中,快捷键的使用及用法

    (1)Ctrl+M切换窗口的大小 (2)Ctrl+Q跳到最后一次的编辑处 (3)F2当鼠标放在一个标记处出现Tooltip时候按F2则把鼠标移开时Tooltip还会显示即Show Tooltip De ...

  3. 【Zookeeper】利用zookeeper搭建Hdoop HA高可用

    HA概述 所谓HA(high available),即高可用(7*24小时不中断服务). 实现高可用最关键的策略是消除单点故障.HA严格来说应该分成各个组件的HA机制:HDFS的HA和YARN的HA. ...

  4. 配置cinder-volume服务使用ceph作为后端存储

    在ceph监视器上执行 CINDER_PASSWD='cinder1234!'controllerHost='controller'RABBIT_PASSWD='0penstackRMQ' 1.创建p ...

  5. octave

    1. octave, 如何求一元二次方程的解: 例如:· -3x-9y=18  ·   4x+3y=12 命令: >>>  A=[-3 -9; 4 3]; B=[18;12]; &g ...

  6. Java-Redis Serializable序列化

    在Java中使用redis存储User对象时,进行JUnit测试时,控制台: 2019-06-24 16:56:45.520 INFO 27688 --- [ main] j.LocalContain ...

  7. PTA (Advanced Level)1082.Read Number in Chinese

    Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese ...

  8. SQLSERVER2008 内存占用高的处理方式

    原文:SQLSERVER2008 内存占用高的处理方式 方法一: 方法二: 使用以下语句查找出什么语句占内存最高,针对占内存高的语句进行优化SELECT SS.SUM_EXECUTION_COUNT, ...

  9. kubectl相关指令

    在列出.描述.修改或删除其他命名空间中的对象时,需要给kubect1命令传递--namespace(或-n)选项.如果不指定命名空间,kubect1将在当前上下文中配置的默认命名空间中执行操作.而当前 ...

  10. Spring4学习回顾之路05—自动装配,Bean的继承,依赖和作用域

    自动装配 xml配置里的Bean的自动装配,Spring IOC容器可以自动装配Bean,仅仅需要做的是在<bean>标签里的autowire属性里指定自动装配的模式. ①byType(根 ...