Python中的装饰器,可以有参数,可以有返回值,那么如何能让这个装饰器既可以装饰没有参数没有返回值的方法,又可以装饰有返回值或者有参数的方法呢?有一种万能装饰器,代码如下:

def decorate(test):             #定义一个装饰器函数

def bold(*args,**kwargs):           #*args可以接收任意多个参数,

#**args可以接收任意多个字典参数

print('style="font-weight:blod"')

res = test(*args,**kwargs)   #这样写,即使被装饰的test函数没有

#返回值也没有关系,不会报错。

return res             #test函数有返回值就返回,没有就返回None

return bold

以上的代码就完成了python万能装饰器的写法,(*args,**kwargs)可以接收任意个数任意类型的参数,有没有返回值都可以return。修改print这句话为自己想要的功能,就是自己的万能装饰器了。这样一来,就可以装饰任意的函数了。

用一下函数来测试一下上面的代码:

@decorate               #装饰一个没有任何参数没有返回值的方法

def test1():

print("test1:没有参数,没有返回值")

@decorate               #装饰一个有一个参数的方法

def test2(name):

print("test2:带参数%s"%name)

@decorate         #装饰一个有返回值的方法

def test3():

strs = "test3:带返回值"

return strs

test1()               #结果为:   style="font-weight:blod"

test1:没有参数,没有返回值

test2("ss")           #结果为:   style="font-weight:blod"

test2:带参数ss

a = test3()

print(a)               #结果为:    style="font-weight:blod"

test3:带返回值

如何写一个Python万能装饰器,既可以装饰有参数的方法,也可以装饰无参数方法,或者有无返回值都可以装饰的更多相关文章

  1. 如何手动写一个Python脚本自动爬取Bilibili小视频

    如何手动写一个Python脚本自动爬取Bilibili小视频 国庆结束之余,某个不务正业的码农不好好干活,在B站瞎逛着,毕竟国庆嘛,还让不让人休息了诶-- 我身边的很多小伙伴们在朋友圈里面晒着出去游玩 ...

  2. 写一个python的服务监控程序

    写一个python的服务监控程序 前言: Redhat下安装Python2.7 rhel6.4自带的是2.6, 发现有的机器是python2.4. 到python网站下载源代码,解压到Redhat上, ...

  3. socket小程序写一个客户端,实现给服务端发送hello World字符串,将客户端发送的数据变成大写后返回

    写一个客户端,实现给服务端发送hello World字符串,将客户端发送的数据变成大写后返回 本机id是192.168.xx.xy 服务端 import socket soc = socket.soc ...

  4. 写一个python脚本监控在linux中的进程

    在虚拟机中安装Linux中的CentOS7系统 https://baijiahao.baidu.com/s?id=1597320700700593557&wfr=spider&for= ...

  5. 不用任何第三方,写一个RTMP直播推流器

    2016年是移动直播爆发年,不到半年的时间内无数移动直播App掀起了全民直播的热潮.然而个人觉得直播的门槛相对较高,从推流端到服务端器到播放端,无不需要专业的技术来支撑,仅仅推流端就有不少需要学习的知 ...

  6. C++写一个简单的解析器(分析C语言)

    该方案实现了一个分析C语言的词法分析+解析. 注意: 1.简单语法,部分秕.它可以在本文法的基础上进行扩展,此过程使用自上而下LL(1)语法. 2.自己主动能达到求First 集和 Follow 集. ...

  7. 写一个Python的windows服务

    1. 安装pywin32和pyinstaller pip install pywin32 pip install pyinstaller 2.写一个服务Demo # -*- coding: utf-8 ...

  8. 手写一个python迭代器

    分析 我们都知道一个可迭代对象可以通过iter()可以返回一个迭代器. 如果想要一个对象称为可迭代对象,即可以使用for,那么必须实现__iter __()方法. 在一个类的实例对象想要变成迭代器,就 ...

  9. (unittest之装饰器(@classmethod)) 让多个测试用例在一个浏览器里面跑 的方法

    一.装饰器 1.用setUp与setUpClass区别 setup():每个测试case运行前运行teardown():每个测试case运行完后执行setUpClass():必须使用@classmet ...

随机推荐

  1. ZOJ2770-Burn The Linked Camp(火烧连营Orz 差分约束-线性约束+最长路(OR反向最短路))

    It is well known that, in the period of The Three Empires, Liu Bei, the emperor of the Shu Empire, w ...

  2. TVP5150 PAL/NTSC ccd cmos 模拟摄像头视频 转换 VGA输出

    新做了一批 视频模块,特此总结下: 解码ic:tvp5150 输入:CVBS  PAL 输出:DVP(bt565  yuv  dvp8  含vs hs) 测试分辨力:(vga输出 640*480) 实 ...

  3. python中bitmap的参数

    Tkinter Bitmaps: 你会使用这个属性显示一个位图.有以下类型的可用位图. 你会使用这个属性显示一个位图.有以下类型的可用位图.: "error" "gray ...

  4. java虚拟机运行内存图

    首先针对8种常见数据类型(byte,short,int,long,double,float,char,boolean),还有String,他们在类对象被引用的时候,把数据类型存放在栈中,而常量则放在常 ...

  5. Win32_DiskDrive 硬盘 参数说明

    Availability  --设备的状态. BytesPerSector  --在每个扇区的物理磁盘驱动器的字节数. Capabilities  --媒体访问设备的能力阵列. CapabilityD ...

  6. ruby 使用 rqrcode 生成二维码

    参考:  https://github.com/whomwah/rqrcode 1.  gem 'rqrcode' 2.  在helper中: require 'base64' def generat ...

  7. for-in的缺点

    for-in用来循环对象中的属性,但是通过for-in循环输出的属性名的顺序是不可测的.具体来说,所有属性都会被返回一次,但返回的先后次序可能会因浏览器而异. ES5之前:如果表示要迭代的对象的变量值 ...

  8. node+express 配置安装以及数据解析,cookie,session

    一.express安装,创建服务 (1)安装:npm install express --save(2)创建服务 server.js: const express = require('express ...

  9. android之 xml文件一般用到的属性

    android:layout_above 将该控件的底部至于给定ID的控件之上android:layout_below 将该控件的顶部至于给定ID的控件之下android:layout_toLeftO ...

  10. 你不知道的JavaScript(上)作用域与闭包

    第一部分 作用域与闭包 第一章 作用域是什么 1.作用域 变量赋值操作会执行两个动作:首先编译器会在当前作用域中声明一个变量(如果之前没有声明过), 然后会在运行时引擎会在作用域中查找该变量,找到就会 ...