首页 > 编程语言 >转载:python装饰器解析

转载:python装饰器解析

时间:2023-08-17 18:06:16浏览次数:42  
标签:解析 return python self func print 转载 def cls

原文链接:https://www.cnblogs.com/songyunjie/p/16825830.html

这里修正原文代码中的部分错误,调试的python版本为:3.9.16

1、什么是装饰器?

Python的装饰器本质上是一个嵌套函数,它接受被装饰的函数(func)作为参数,并返回一个包装过的函数。这样我们可以在不改变被装饰函数的代码的情况下给被装饰函数或程序添加新的功能。

2、装饰器的基本用法

def func1(func):
    def newfunc():
        print(1)
        func()
        print(2)
    return newfunc

def func():
    print(3)

func = func1(func)
func()

3、@符号用法

def func1(func):
    def newfunc():
        print(1)
        func()
        print(2)
    return newfunc

@func1
def func():
    print(3)

func()

4、装饰器嵌套

def func1(func):
    def newfunc():
        print(1)
        func()
        print(2)
    return newfunc

def func2(func):
    def newfunc1():
        print(4)
        func()
        print(5)
    return newfunc1

@func1
@func2
def func():
    print(3)

func()

5、用装饰器扩展带有参数的原函数

def func1(func):
    def newfunc(who,where):
        print('程序开始前')
        func(who,where)
        print('程序开始后')
    return newfunc

@func1
def func(who, where):
    print(f"{who}在{where}吃饭")

func('张三','李四家里')

 6、用装饰器扩展带有参数和返回值的原函数

def func1(func):
    def newfunc(*args, **kwargs):
        print(1)
        res = func(*args, **kwargs)
        print(2)
        #print(res)
        return res
    return newfunc

@func1
def func(*args, **kwargs):
    lst = []
    dic = {'name':"张三"}
    for i in args:
        print(i)
    for k,v in kwargs.items():
        if k in dic:
            strvar = dic[k] + 'aaa' + v +'bb'
            lst.append(strvar)
    return lst

lst = func('电影院',name = '12')

7、类装饰器扩展原函数

class Myclass():
    def __call__(self, func):
        return self.func2(func)

    def func1(func):
        def newfunc():
            print(1)
            func()
            print(2)
        return newfunc

    def func2(self, func):
        def newfunc1():
            print(3)
            func()
            print(4)
        return newfunc1
    
# 方法一
@Myclass.func1
def func():
    print(5)

func()

# 方法二
@Myclass()
def func():
    print(5)

func()

8、带有参数的函数装饰器

def outer(num):
    def newfunc(func):
        def newfunc1(self):
            print(1)
            func(self)
            print(2)
        def newfunc2(self):
            print(3)
            func(self)
            print(4)
        if num == 1:
            return newfunc1
        elif num == 2:
            return newfunc2
    return newfunc
class Myclass():
    @outer(2)
    def func1(self):
        print(5)

obj = Myclass()
obj.func1()

9、带有参数的类装饰器

class Myclass1():
    id = 4445

    def __init__(self, num):
        self.num = num

    def __call__(self, cls):
        if self.num == 1:
            return self.newfunc1(cls)
        else:
            return self.newfunc2(cls)

    def test(self):
        print(1)

    def newfunc1(self, cls):
        def newfunc():
            # 为当前cls这个类添加属性
            cls.id = self.id
            # 为当前cls这个类添加方法
            cls.test = self.test
            return cls()
        return newfunc

    def newfunc2(self, cls):
        def newfunc():
            # 为当前cls这个类添加属性
            cls.id = self.id
            # 为当前cls这个类添加方法
            cls.test = self.test
            if "run" in cls.__dict__:
                # print(cls.run(),"123")
                # 调用类中方法
                res = cls.run(cls)
                cls.run = res
                return cls()
        return newfunc

# 参数1
@Myclass1(1)
class Myclass():
    def run(self):
        return "亢龙有悔"


obj = Myclass()
print(obj.id)
obj.test()

# @Myclass1()括号中的参数为1时
print(obj.run())

# @Myclass1()括号中的参数非1时
# print(obj.run)




标签:解析,return,python,self,func,print,转载,def,cls
From: https://blog.51cto.com/tryagaintry/7125814

相关文章

  • Python学习日记 2023年8月17日
    今天有点懒啊,做的东西少了点importosimportjiebaimportwordcloudimportimageio#pho=imageio.imread('7848.jpg')f=open('口红.txt')txt=f.read()txt_list=jieba.lcut(txt)string=''.join(txt_list)wc=wordcloud.WordCloud(......
  • Python分享之requests(3)
    6)身份验证基本身份认证(HTTPBasicAuth)importrequestsfromrequests.authimportHTTPBasicAuthr=requests.get('https://httpbin.org/hidden-basic-auth/user/passwd',auth=HTTPBasicAuth('user','passwd'))#r=requests.get('http......
  • 你能发现这段 Python 代码中的 bug 吗?
    点击链接了解详情【CSDN编者按】大家一起来找Bug。原文链接:https://dwrodri.gitlab.io/can-you-spot-the-bug-in-this-python-code/本文已获作者授权,未经允许,禁止转载!作者|DerekRodriguez译者|弯月责编|夏萌出品|CSDN(ID:CSDNnews)最近,在解析文本时,我遇到了一个......
  • Python爬虫初探
    title:Python爬虫初探date:2023-08-0116:16:51categories:CTF-Web入门description:爬取吉大贴吧前十页帖子标题终于到了基础知识的最后一节,python写爬虫程序。Python写简单爬虫主要是两个模块,requests和re,下面分别介绍一下这两个模块。requests模块初探请求模块,用来......
  • java:使用flexmark-java 实现 CommonMark(规范 0.28)解析
    文档https://github.com/vsch/flexmark-java依赖Java8<dependency><groupId>com.vladsch.flexmark</groupId><artifactId>flexmark-all</artifactId><version>0.62.2</version></dependency>Java9+&l......
  • python项目 如何快速的导入和导出依赖包
    Python项目依赖包【导出】第一步:安装pipreqs包pip3installpipreqs第二步骤:进入项目的根目录执行以下命令:cd根目录第三步:转成requirements.ext文件:pipreqs./--encoding=utf-8--force如果成功,就会在根目录下生成一个requirements.txt文件,内容为本项目环境以来包已经对......
  • python中3种获取cookie解决方案
    方案一:利用selenium+phantomjs无界面浏览器的形式访问网站,再获取cookie值:fromseleniumimportwebdriverdriver=webdriver.PhantomJS()url="https://et.xiamenair.com/xiamenair/book/findFlights.action?lang=zh&tripType=0&queryFlightInfo=XMN,PEK,2018-01-15"drive......
  • python3添加ssl模块
    1.安装opensslwget https://www.openssl.org/source/openssl-1.1.1v.tar.gztar openssl-1.1.1v.tar.gzcd openssl-1.1.1v./config--prefix=/usr/local/opensslsharedzlib测试/usr/local/openssl/bin/openssl 若报错:/usr/local/openssl/bin/openssl:errorwhileloa......
  • 笔记整理--C语言--assert用法总结——转载
    assert用法总结assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include<assert.h>voidassert(intexpression);assert的作用是现计算表达式expression,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用abort来......
  • Python实现自定义请求头消息headers
    使用python爬虫爬取数据的时候,经常会遇到一些网站的反爬虫措施,一般就是针对于headers中的User-Agent,如果没有对headers进行设置,User-Agent会声明自己是python脚本,而如果网站有反爬虫的想法的话,必然会拒绝这样的连接。而修改headers可以将自己的爬虫脚本伪装成浏览器的正常访问,来......