day12 python学习 装饰器
闭包函数:
内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数
#函数内部定义的函数称为内部函数
闭包函数获取网络应用
from urllib.request import urlopen def index():
url = "http://www.xiaohua100.cn/index.html"
def get():
return urlopen(url).read()
return get xiaohua = index() #层层调用层层返回的一个函数#
content = xiaohua() #每一层得到的返回值都是下一层的函数,执行返回值
#就是执行下一层函数。
print(content)
判断闭包函数的公式print(inner.__closure__)
输出的__closure__有cell元素 :是闭包函数
def func():
name = 'eva'
def inner():
print(name)
print(inner.__closure__)
return inner
函数名的本质:
就是一个变量,保存了函数所在的内存地址
2.装饰器
装饰器的本质:一个闭包函数
装饰器的功能:在不修改原函数及其调用方式的情况下对原函数功能进行扩展
##完美的装饰器
def warpper(func): #warpper 是装饰器的名字,被传入的参数就是函数的名字
def inner(*args,**kwargs): #在装饰器中需要定义一个内部函数inner
"""函数前的内容"""
ret=func(*args,*kwargs)#被装饰的函数,并且要执行
"""函数后的内容"""
return ret#函数的的返回值
return inner#将内部函数的名字返回
@warpper #这个就是语法糖 func=swapper(func)
def func():
print('aaa')
func() 执行次布就是在执行 swapper(func)() swapper(func)先将 inner 返回 然后后边还有一个括号 所以接着执行 inner() 将参数穿进去执行它就会执行它内部的函数
# #登录 要完成用户一次登录后就不用再登录就可以执行打开网页的功能,
flag=True
def paswer(func):
def inner(*args,**kwargs): #先写一个登录的程序,然后将他封装起来,放在内部
global flag #这个必须从外部引入一个全局变量Flag然后再在内部将他改变
#否则再次想要打开其他的页面的时候,运行那个程序还会再让你登录
name = 'alex'
pas = ''
if flag:
username = input('请输入用户名')
password = input('请输入密码')
if name == username and pas == password:
print('登录成功')
flag = False
if flag==False: #这里不能是else 因为因为else的话上边输错密码也会从新登录
func(*args,**kwargs)
return inner
@paswer
def func1():
print ('欢迎来到目录页')
@paswer
def func2():
print("欢迎来到小结页") func2()
func1()
开放封闭原则
1.对扩展是开放的
为什么要对扩展开放呢?
我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。
2.对修改是封闭的
为什么要对修改封闭呢?
就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。
装饰器完美的遵循了这个开放封闭原则。

装饰器进阶
#装饰器进阶
#装饰器的进阶有两个
@func1
@func2
def ada()
#俄罗斯套娃式函数,里边套靠近函数的
#装饰器函数,外边套另一个函数# 要记住是那个套那个的
ef wrapper1(func):
def inner1(*args,**kwargs):
print('in wrapper 1,before')
ret = func(*args,**kwargs) #qqxing
print('in wrapper 1,after')
return ret
return inner1 def wrapper2(func): #inner1
def inner2(*args,**kwargs):
print('in wrapper 2,before')
ret = func(*args,**kwargs) #inner1
print('in wrapper 2,after')
return ret
return inner2
#当一个函数要引用两个装饰器才能完成功能时
@wrapper2 #先在外层执行这个的第一句
@wrapper1 #在执行这个地方执行的所有内容,然后再返回去执行上边的函数剩下的内容
def qqxing():
print('qqxing')
qqxing()
#装饰器进阶2 带有def outer():的函数
1 # 带参数的装饰器:(相当于开关)为了给装饰器传参
2 # F=True#为True时就把装饰器给加上了
3 F=False#为False时就把装饰器给去掉了
4 def outer(flag):
5 def wrapper(func):
6 def inner(*args,**kwargs):
7 if flag:
8 print('before')
9 ret=func(*args,**kwargs)
10 print('after')
11 else:
12 ret = func(*args, **kwargs)
13 return ret
14 return inner
15 return wrapper
16
17 @outer(F)#@wrapper
18 def hahaha():
19 print('hahaha')
20
21 @outer(F)
22 def shuangwaiwai():
23 print('shuangwaiwai')
24
25 hahaha()
26 shuangwaiwai()
day12 python学习 装饰器的更多相关文章
- Python学习---装饰器/迭代器/生成器的学习【all】
Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210
- Python学习---装饰器的学习1210
装饰器的基础 学习前提: 作用域 + 函数的理解 + 闭包 [学习,理解] 代码编写原则: 对修改开放对扩展开放 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前 ...
- python学习---装饰器
什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 装饰器需要遵循的原则 1.不修改被装饰函数的源代码(开放封闭原则) 2.为被装饰函数 ...
- python学习——装饰器函数
一.装饰器函数的作用是什么 答:装饰器函数是在不修改原函数及其调用方式的情况下对原函数功能进行扩展 对于搞python开发的人来说,函数占据了至关重要的地位.都说学好函数你就可以去找工作了,好了,假如 ...
- Python学习——装饰器/decorator/语法糖
装饰器 定义:本质是函数,为其他函数添加附加的功能. 原则:1.不能修改原函数的源代码 2.不能修改被原函数的调用方式 重点理解: 1.函数即“变量” 2.高阶函数:返回值中包含函数名 3.嵌套函数 ...
- python之循序渐进学习装饰器
python装饰器的定义:在代码运行期间在不改变原函数定义的基础上,动态给该函数增加功能的方式称之为装饰器(Decorator) 装饰器的优点和用途: 1. 抽离出大量函数中与函数功能本身无关的的雷同 ...
- python基础 (装饰器,内置函数)
https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...
- python初级装饰器编写
最近项目太忙好久没有学习python了,今天更新一下吧~~ 1.什么是python装饰器: 装饰器本质上是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返 ...
- Python之装饰器、迭代器和生成器
在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...
随机推荐
- Linux : 密码正确不能正常登陆,日志提示Could not get shadow information for user
今天,再玩Centos7的时候,尝试修改了下ssh的端口.因为默认开启了SELinux,如果没有修改这个文件配置就修改端口sshd服务就不能正常启动了. 但是,当我修改会22端口的时候还是不能正常登陆 ...
- Linux 下载最新kubectl版本的命令:
ubuntu centos下通用 第一步.下载最新版本的命令: curl -LO https://storage.googleapis.com/kubernetes-release/release/$ ...
- $LANG、$NLS_LANG 记录一下
环境:linux $LANG 为linux termal终端环境下的 语言环境 $NLS_LANG 为oracle数据库中 会话中的语言环境. 个人理解,望大家补充
- c# 如何将字符串中用","分开的数字分别存入数组中
string[] str="1,2,3,11,12,13".Split(',');
- SSH 绑定本地端口
SSH可以传送数据,那么我们可以让那些不加密的网络连接,全部改走SSH连接,从而提高安全性. 假定我们要让8080端口的数据,都通过SSH传向远程主机,命令就这样写: $ user@host SSH会 ...
- PHP中输出本地时间
<?php header("Content-Type:text/html;charset=utf-8"); // 输出日 echo date("l") . ...
- hadoop kafka install multi-borker (7)
multi-borker function like cluster technology First we make a config file for each of the brokers (o ...
- 快速切题 sgu102.Coprimes 欧拉函数 模板程度 难度:0
102. Coprimes time limit per test: 0.25 sec. memory limit per test: 4096 KB For given integer N (1&l ...
- Java——object类
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 特征选择: 卡方检验、F 检验和互信息
特征选择是特征工程中的重要一环,其主要目的是从所有特征中选出相关特征 (relevant feature),或者说在不引起重要信息丢失的前提下去除掉无关特征 (irrelevant feature) ...