Python 入门之 Python三大器 之 装饰器

1、开放封闭原则:

(1)代码扩展进行开放

​ 任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

(2)修改源代码是封闭

​ 当我们写的一个函数,已经交付给其他人使用,如果这个时候我们对函数内部进行修改,或者修改了函数的调用方式,很有可能影响其他已经在使用该函数的用户。

在不修改源代码及调用方式,对功能进行额外的添加就是开放封闭原则

2、装饰器:

在不改变原被装饰的函数的源代码以及调用方式下,为其添加额外的功能。

(1)初识装饰器:

​ 装饰(额外功能) 器(工具:函数)

import time

def index():
time.sleep(2) #
print("这是小明写的功能") def func():
time.sleep(1) #
print("这是小刚写的功能") def red():
time.sleep(2) #
print("这是小红写的功能") start_time = time.time() # 时间戳
index()
print(time.time() - start_time) start_time = time.time() # 时间戳
func()
print(time.time() - start_time) start_time = time.time() # 时间戳
red()
print(time.time() - start_time)

( 此方法返回的是格林尼治时间,是此时此刻距离1970年1月1日0点0分0秒的时间秒数.也叫时间戳,它是一直变化的。)

import time
print(time.time())

以上代码重复,繁琐

改进:(将求时间写在一个函数中,函数就是以功能为导向,减少重复代码)

import time

def index():
time.sleep(2) #
print("这是小明写的功能") def func():
time.sleep(1) #
print("这是小刚写的功能") def red():
time.sleep(2) #
print("这是小红写的功能") def times(func):
start_time = time.time() # 时间戳
func()
print(time.time() - start_time) times(index)
times(func)

改进:

第一版装饰器
import time
def func():
time.sleep(1) #
print("这是小刚写的功能") def red():
time.sleep(2) #
print("这是小红写的功能") def index():
time.sleep(2) #
print("这是小明写的功能") def times(func):
def foo():
start_time = time.time() # 时间戳 被装饰函数执行前干的事
func()
print(time.time() - start_time) # 被装饰函数执行后干的事
return foo # 不能加括号 index = times(index) # 不能加括号
index()
func = times(func)
func()

(2)语法糖 (Python 帮我们做的一个东西)

要将语法糖写在被装饰函数的最上方
def warpper(f):
def inner():
print("111")
f()
print("222")
return inner # python帮咱们做的一个东西,语法糖
@warpper # func = warpper(func)
def func():
print("被装饰的函数1") @warpper # index = warpper(index)
def index():
print("被装饰的函数2") func()
def warpper(f):
def inner(*args,**kwargs):
print("被装饰函数执行前")
ret = f(*args,**kwargs)
print("被装饰函数执行后")
return ret
return inner @warpper
def func(*args,**kwargs):
print(f"被装饰的{args,kwargs}")
return "我是func函数" @warpper
def index(*args,**kwargs):
print(11111) print(func(1,2,3,4,5,6,7,8,a=1))

(3)标准版的装饰器:

def wrapper(func):
def inner(*args,**kwargs):
'''执行被装饰函数之前的操作'''
ret = func()
'''执行被装饰函数之后的操作'''
return ret
return inner

这个就是标准的装饰器,完全符合代码开放封闭原则。

4、装饰器进阶

(1)有参装饰器

def auth(argv):
def warpper(func):
def inner(*args,**kwargs):
if argv == "博客园":
print("欢迎登录博客园")
user = input("user:")
pwd = input("pwd:")
if user == 'alex' and pwd == "dsb":
func(*args,**kwargs)
elif argv == "码云":
print("欢迎登录码云")
user = input("user:")
pwd = input("pwd:")
if user == 'alex' and pwd == "jsdsb":
func(*args, **kwargs) return inner
return warpper def foo():
print("被装饰的函数") msg = input("请输入您要登录的名字:")
a = auth(msg)
foo = a(foo)
foo()
def auth(argv):
def wrapper(func):
def inner(*args,**kwargs):
if argv:
print("我加上功能了!")
func(*args,**kwargs)
else:
func(*args,**kwargs)
return inner
return wrapper https://www.cnblogs.com/ @auth(True) # @auth == foo = wrapper(foo) = auth(True) flask框架
def foo():
print("这是一个点燃")
foo()

(2)多个装饰器装饰一个函数

多个装饰器装饰一个函数,先执行离被装饰函数最近的装饰器

def auth(func):             # wrapper1装饰器里的 inner
def inner(*args,**kwargs):
print("额外增加了一道 锅包肉")
func(*args,**kwargs)
print("锅包肉 38元")
return inner def wrapper1(func): # warpper2装饰器里的 inner
def inner(*args,**kwargs):
print("额外增加了一道 刺生")
func(*args,**kwargs)
print("刺生 白吃")
return inner def wrapper2(func): # 被装饰的函数foo
def inner(*args,**kwargs):
print("额外增加了一道 麻辣哥")
func(*args,**kwargs)
print("难以下嘴")
return inner def foo():
print("这是一个元宝虾饭店") foo = wrapper2(foo) # inner = wrapper2(foo)
foo = wrapper1(foo) # inner = wrapper1(inner)
foo = auth(foo) # inner = auth(inner)
foo() # auth里边的inner()
def auth(func):            # wrapper1装饰器里的 inner
def inner(*args,**kwargs):
print(123)
func(*args,**kwargs)
print(321)
return inner def wrapper1(func): # warpper2装饰器里的 inner
def inner(*args,**kwargs):
print(111)
func(*args,**kwargs)
return inner def wrapper2(func): # 被装饰的函数foo
def inner(*args,**kwargs):
print(222)
func(*args,**kwargs)
print(567)
return inner @auth # 1 7
@wrapper1 # 2 6
@wrapper2 # 3 5
def foo(): # 4
print("www.baidu.com")
foo()

Python 入门之 Python三大器 之 装饰器的更多相关文章

  1. python入门(十五):装饰器

    1.装饰器(decorator):设计模式 作用:给不同的函数和方法,增加不同的公用的功能. @classmethod,@staticmethod等均是装饰器 定义一个装饰函数,函数必须返回一个闭包函 ...

  2. Python 入门之 Python三大器 之 生成器

    Python 入门之 Python三大器 之 生成器 1.生成器 (1)什么是生成器? 核心:生成器的本质就是一个迭代器 迭代器是Python自带的 生成器程序员自己写的一种迭代器 def func( ...

  3. Python 入门之 Python三大器 之 迭代器

    Python 入门之 Python三大器 之 迭代器 1.迭代器 (1)可迭代对象: <1> 只要具有__ iter __()方法就是一个可迭代对象 (我们可以通过dir()方法去判断一个 ...

  4. Python入门基础学习 三

    Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...

  5. Python 全栈开发五 迭代器 生成器 装饰器

    一.迭代器 迭代协议:对象必须提供一个next方法,执行该方法后会返回迭代的下一项或者抛出Stopiteration异常,终止迭代.切只能往前,不能倒退. 可迭代对象:遵循迭代写一点对象就是可迭代对象 ...

  6. Python四大神兽(迭代器&生成器&闭包&装饰器)

    一.迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式.. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不 ...

  7. Python 闭包、迭代器、生成器、装饰器

    Python 闭包.迭代器.生成器.装饰器 一.闭包 闭包:闭包就是内层函数对外层函数局部变量的引用. def func(): a = "哈哈" def func2(): prin ...

  8. Python 入门之Python简介

    Python 入门之Python简介 1.Python简介: (1) Python的出生: ​ python的创始人为吉多·范罗苏姆(Guido van Rossum)(中文名字:龟叔).1989年的 ...

  9. Python入门之 Python内置函数

    Python入门之 Python内置函数 函数就是以功能为导向,一个函数封装一个功能,那么Python将一些常用的功能(比如len)给我们封装成了一个一个的函数,供我们使用,他们不仅效率高(底层都是用 ...

随机推荐

  1. linux安装配置Redis,Swoole扩展

    我是使用的是lnmp环境(php5.6.3) 一.安装redis数据库(参考w3c手册) 下载地址:http://redis.io/download 本教程使用的最新文档版本为 2.8.17,下载并安 ...

  2. Linux培训教程 浅谈:PHP在linux上执行外部命令(整理)

    一.PHP中调用外部命令介绍 二.关于安全问题 三.关于超时问题 四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,可以用,1>调用专门函数 ...

  3. BOM和DOM的操作

    到目前为止,我们已经学过了JavaScript的一些简单的语法.但是这些简单的语法,并没有和浏览器有任何交互.也就是我们还不能制作一些我们经常看到的网页的一些交互,我们需要继续学习BOM和DOM相关知 ...

  4. eclipse设置酷炫的代码颜色风格

    eclipse安装默认的代码颜色风格是“白色背景”,颜色有些刺眼,于是想到手动去改eclipse的代码颜色,但改来改去还是很难达到我们的要求,甚至有时候将背景和某些代码的颜色改成相同,导致代码看不见. ...

  5. SQL Server CDC最佳实践

    企业核心业务系统oltp的数据需要通过ETL同步到数据仓库,原始的ETL流程通过定制化从SQL Server中进行数据抽取,经过生产环境的监控,发现ETL过程的query会对生产系统造成额外负载.于是 ...

  6. modern php笔记---1、新时代的php

    modern php笔记---1.新时代的php 一.总结 一句话总结: php有Zend Engine 和 Facebook开发的 HipHop Virtual Machine两套引擎 1.php也 ...

  7. XDebug安装配置教程

    笔者的开发环境如下:Windows8.1+Apache+PhpStorm+XDebug+Firefox(XDebug helper 1.4.3插件). 转载http://www.jb51.net/ar ...

  8. leetcode-mid-math-202. Happy Number-NO

    mycode 关键不知道怎么退出循环.............其实只要有一个平方和以前出现过,那么整个计算过程就会重复 参考: class Solution(object): def isHappy( ...

  9. LoadRunner之关联

    一.什么是关联 关联就是将服务器动态返回变化的值保存为一个参数以供后面需要用到的地方使用. 二.什么时候需要关联 1.服务器返回中存在动态变化的值,一般是类似session.token这样的无规则数据 ...

  10. USB转换PS2接线原理

    https://blog.csdn.net/dfyy88/article/details/4540170 USB转换PS2接线原理 2009年09月10日 18:36:00 阅读数:13285 USB ...