首页 > 编程语言 >python装饰器

python装饰器

时间:2022-10-23 14:14:11浏览次数:47  
标签:__ name python register method warpper 装饰 cls

省流:直接看最后

从简单的例子开始,定义装饰器register,定义一个简单的类method,使用装饰器装饰类

def register(*args, name=None):
    def warpper(method_cls):
        print('warpper cls')
        return method_cls
    print(args, name)
    return warpper


@register('hello', name='name')
class method:
    def __init__(self):
        print('__init__ method class')

当import这个文件或者执行这个文件时,相当于执行了:

method = register('hello', name='name')(method)

这一步分开来看就是:

tmp1 = register('hello', name='name')
method = tmp1(method)

tmp1是一个函数,就是register返回的warpper,然后调用tmp1,参数是类名,返回类本身。
这个执行是在定义类时执行的,并不是实例化时执行的。
比如执行上述代码输出:

('hello',) name
warpper cls

如果装饰器调用时没参数,那就自动传入类名作为参数。比如:

def register(*args, name=None):
    def warpper(method_cls):
        print('warpper cls')
        return method_cls
    print(args, name)
    return warpper

@register
class method:
    def __init__(self):
        print('__init__ method class')

输出就是:

(<class '__main__.method'>,) None

注意:这里将类作为register的参数,相当于

method = register(method)

这时,再实例化method类,就会导致报错:代码添加

method()

输出:

(<class '__main__.method'>,) None
Traceback (most recent call last):
  File "decorators.py", line 15, in <module>
    method()
TypeError: warpper() missing 1 required positional argument: 'method_cls'

warpper缺少参数!这说明调用method()时,已经是在调用warpper()了

省流:

进行到这一步,可以总结了:
假设写了一句

@xxx
class abc:
	...

实际执行的就是:

abc = xxx(abc)

如果你写的是@xxx(balabala),那就是abc = xxx(balabala)(abc)

也就是不管你@后面写什么,都会自动调用并传入参数为下面的类/函数,(也就是自动在xxx后面加括号并传入类/函数作为参数)

标签:__,name,python,register,method,warpper,装饰,cls
From: https://www.cnblogs.com/wangbingbing/p/16818465.html

相关文章

  • Python中的矩阵——NumPy包
    Part1安装NumPy包,以VScode为例:打开VisualStudioCode,选取任一python项目文件,运行该文件,在终端(Terminal)中输入cd+空格+Python安装目录下Scripts文件的路径,例如我......
  • 我决定以后一直使用Eclipse了 因为它也可以安装集成PyDec插件来实现Python开发了 哇哈
    前言​​Python​​​作为当今主流的爬虫编程语言,在我们的开发当中时不时都会使用到一些,那么如果你想再​​Eclipse​​​当中进行一些​​Python​​​的开发就要安装一下......
  • win11系统下python3.10安装face_recognition和dlib
     作者:......
  • Python笔记
    @目录前言总结如何搭建虚拟环境main.py文件一定要根目录下面python中类的变量和实例变量的区别pyqt5的按钮点击事件删除线程函数问题使用pyinstaller编译成exe 如果提示 ......
  • Python正则表达式
    1.10Python正则表达式正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re模块使Python语言拥有全部的正则表达式功能。compile......
  • # yyds干货盘点 # 盘点Python网络爬虫过程中xpath的联合查询定位一个案例
    大家好,我是皮皮。一、前言前几天在Python钻石交流群【髙鵬】问了一个​​Python​​网络爬虫的问题,提问截图如下:原始代码如下:importtimefromseleniumimportwebdriverfro......
  • python虚拟环境搭建
    @目录前言创建激活运行CodeRunner使用虚拟环境在线安装离线安装前言使用Python开发项目免不了要安装各种包。我们安装的所有包都会被安装到同一个目录下,供Python调用。......
  • 力扣1768(java&python)-交替合并字符串(简单)
    题目:给你两个字符串word1和word2。请你从word1开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。返......
  • 【Python】第3章-21 判断回文字符串
    输入一个字符串,判断该字符串是否为回文。回文就是字符串中心对称,从左向右读和从右向左读的内容是一样的。输入格式:输入在一行中给出一个不超过80个字符长度的、以回车结......
  • 【Python】第3章-20 逆序的三位数
    程序每次读入一个正3位数,然后输出按位逆序的数字。注意:当输入的数字含有结尾的0时,输出不应带有前导的0。比如输入700,输出应该是7。输入格式:每个测试是一个3位的正整数。......