惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
B
Blog
阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Jina AI
Jina AI
博客园 - 聂微东
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
L
LangChain Blog
M
MIT News - Artificial intelligence
Blog — PlanetScale
Blog — PlanetScale
腾讯CDC
酷 壳 – CoolShell
酷 壳 – CoolShell
Y
Y Combinator Blog
F
Fortinet All Blogs
H
Help Net Security
B
Blog RSS Feed
J
Java Code Geeks
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Apple Machine Learning Research
Apple Machine Learning Research
S
SegmentFault 最新的问题

老董笔记

尚硅谷机构在哪?尚硅谷培训怎么样?靠谱吗-互联网IT百科 韩顺平介绍,传智讲师,开办泰牛,入尚硅谷等一系列-互联网IT百科 pandas多重索引标准样式(写入excel有空行)-互联网IT百科 cannot join with no overlapping index names-互联网IT百科 pandas多列变多行(即宽表变长表)melt和stack函数-互联网IT百科 pandas多行转多列(长表变宽表)pivot和unstack-互联网IT百科 Index contains duplicate entries, cannot reshape完美解决-互联网IT百科 single positional indexer is out-of-bounds-互联网IT百科 Can only compare identically-labeled Series objects-互联网IT百科 pandas transform用法详解(多个案例)-互联网IT百科 python四舍五入精确实现-互联网IT百科 pandas的groupby使用apply分组排序-互联网IT百科 index 0 is out of bounds for axis 0 with size 0-互联网IT百科 pandas分组过滤filter函数-互联网IT百科 联想Win10系统如何禁用触摸屏关闭触摸-互联网IT百科 groupby分组计算transform转换返回相同长度序列-互联网IT百科 brooks seo教程python教程,brooks seo教程网盘,布鲁seo资源-互联网IT百科 电脑右键文件夹一直转圈电卡死怎么回事-互联网IT百科 施琪嘉的心理成长课(荐)-互联网IT百科 百度SEO公司_SEO推广公司哪家好_SEO外包服务如何选-老董笔记 groupby后agg同1列用多个聚合函数、不同列用不同函数、自定义函数-互联网IT百科 pandas的groupby单列多列分组聚合运算-互联网IT百科 DataFrameGroupBy对象及分组个数、分组大小、组名索引、组数据详解-互联网IT百科 pandas中groupby之Grouper and axis must be same length-互联网IT百科 pandas中groupby的分组原理-互联网IT百科 pandas的groupby的使用详解大全-互联网IT百科 openpyxl单元格自动换行强制换行Alignment(wrapText=True)-互联网IT百科 python教程全套(可就业)-互联网IT百科 联想win10系统CPU显示100%,电脑呼呼响怎么回事-互联网IT百科 如何自制CPU,CPU原理是怎么样的?-互联网IT百科
python装饰器详解,装饰器原理解析-互联网IT百科
2020-05-18 · via 老董笔记

  python装饰器并不是什么神奇之物,更像是python作者的"装逼"之物,python装饰器实际上是python作者对函数做了一层封装,让一个函数在执行前先发生点别的事!某些场景会让我们写代码的人用起来更加简洁。

  为了了解装饰器,我们从一个现实的场景中来感受:技术部需要给运营部seo优化师和sem优化师提供数据查询服务,这个服务很简单,一直以来都是如下操作。

# -*- coding: utf-8 -*-

def seo():
    print('获取seo数据')


def sem():
    print('获取sem数据')

  现在要做安全升级,凡是查询数据的人都要进行验证,于是技术小哥就本能的写了个验证函数,然后再原有的查询函数中增加了该函数

# -*- coding: utf-8 -*-

def check_person():
    """
    一段操作
    """
    print('验证ok')

def seo():
    check_person()
    print('获取seo数据')
    
def sem():
    check_person()
    print('获取sem数据')

  技术总监一看发现这厮把原来的函数塞了一堆自己的代码进去就很不满意,让他再改善改善。小哥灵机一动又变了变写法,干脆自己定义新的函数。

# -*- coding: utf-8 -*-

def check_person():
    """
    一段操作
    """
    print('验证ok')


def new_seo():
    check_person()
    print('获取seo数据')
new_seo()



def new_sem():
    check_person()
    print('获取sem数据')
new_sem()

  技术总监看了后还不满意,他说写代码要遵循开放封闭原则,已经实现的功能代码不允许被修改。让技术小哥思考如何不改变原来的函数且调用原函数还能实现新加的功能,小哥突然脑洞一开就把代码进行了改造。

# -*- coding: utf-8 -*-

# 参数是函数名
def new_check(func):
    def check_person():
        """
        一顿验证操作
        """
        print('验证ok')
        func()
    return check_person


# 把原来的函数名当做参数传递,把返回的函数仍然命名为原始的函数名
seo = new_check(seo)
seo()
sem = new_check(sem)
sem()

  经过这么巧妙的改造确实遵循了开放封闭的原则,但是总感觉有点啰嗦,别担心。这一切其实都在python作者预料之中,python给你提供了装饰器来实现,只需要一个@符号来实现。

# -*- coding: utf-8 -*-

def new_check(func):
    def check_person():
        """
        一顿验证操作
        """
        print('验证ok')
        func()
    return check_person


@new_check
def seo():
    print('seo要查询数据了')
seo()


@new_check
def sem():
    print('sem要查询数据了')
sem()
验证ok
seo要查询数据了
验证ok
sem要查询数据了

  上面就是装饰器的原理,就用了一下闭包的知识,没有什么复杂之处。只是python作者给提供了一个@符号来掩盖了中间的过程,所以让人感觉很高端,这叫python语法糖!

  先了解基本原理,含有参数的函数被装饰、多个装饰器同时装饰一个函数的情况,我们后面再讲。

很赞哦!

python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会