python —— 装饰器

  • 1、装饰器简介
  • 2、简单装饰器
  • 3、带参数的装饰器
  • 3、类装饰器
  • 4、functools.wraps
  • 5、内置装饰器
    • 5.1 @classmethod
    • 5.2 @staticmethod
    • 5.3 @property
  • 6、属性的分类
    • 6.1 实例的属性
    • 6.2 类属性
    • 6.3 类属性

1、装饰器简介

  • 1、函数也是一个对象,而且函数对象也可以被赋值给变量,所以通过变量也能调用该函数
  • 2、函数对象有一个__name__属性,可以拿到函数的名字
  • 3、装饰器的作用就是为已经存在的对象添加额外的功能
  • 4、装饰器是在定义函数和类的时候使用

2、简单装饰器

实现我们在跑程序的时候告诉我们运行进度

def decorator_process(func):def wrapper(*args,**kargs):print("%s已经开始运行"%func.__name__)return func(*args,**kargs)return wrapper@decorator_process
def wj_sum(a,b):print(a+b)-7
wj_sum(5,6)

3、带参数的装饰器

装饰器允许我们在调用时提供给它参数

def decorator_user(user):def decorator(func):def wrapper(*args,**kargs):print("%s在使用%s函数"%(user,func.__name__))return func(*args,**kargs)return wrapperreturn decorator@decorator_user("wj")
def wj_average(a,b):print((a+b)/2)wj_average(2,5)

3、类装饰器

  • 相比于函数装饰器,装饰器具有灵活度大、高内聚、封装性等优点,
  • 使用类装饰器还可以依靠内部的__recall__方法,
  • 当使用@形式将装饰器附加到函数上时,就会调用此方法
class decorate_process_cls(object):def __init__(self,func):self.func = funcdef __call__(self,*args,**kargs):print("%s函数开始运行"%self.func.__name__)self.func(*args,**kargs)print("%s函数运行结束"%self.func.__name__)@decorate_process_cls
def wj_mean(a,b):print((a+b)/2)wj_mean(2,5)

4、functools.wraps

  • 使用装饰器极大地复用了代码,但是它有一个缺点就是原函数的元信息不见了;
  • 这个问题就比较严重,好在我们有functools.wraps,wraps本身也是一个装饰器;
  • 它能把原函数的元信息拷贝到装饰器函数中,这使得装饰函数也也有和原函数一样的元信息。
from functools import wraps
import datetimeclass decorator_process_cls2(object):def __init__(self,func):self.func = funcdef __call__(self,*args,**kargs):"""这是一个装饰器"""print(datetime.datetime.now(),"%s程序开始运行"%self.func.__name__)self.func(*args,**kargs)print(datetime.datetime.now(),"%s程序结束运行"%self.func.__name__)@decorator_process_cls2
def wj_multiply(a,b):"""这是原函数"""print(a*b)print(dir(wj_multiply))class decorator_process_cls2(object):def __init__(self,func):self.func = func@wrapsdef __call__(self,*args,**kargs):"""这是一个装饰器"""print(datetime.datetime.now(),"%s程序开始运行"%self.func.__name__)self.func(*args,**kargs)print(datetime.datetime.now(),"%s程序结束运行"%self.func.__name__)@decorator_process_cls2
def wj_multiply(a,b):"""这是原函数"""print(a*b)print(dir(wj_multiply))

5、内置装饰器

  • @classmethod
  • @staticmethod
  • @property

5.1 @classmethod

  • 我们要写一个实例不能调用,而能用类调用的方法,则可添加@classmethod的装饰器
  • 此时函数不需要传self这个参数,但是需要传类这个对象作为参数
class wj_1(object):name = "张三"age = 18@classmethoddef infor(class_object):print(class_object.name,"的年龄是",class_object.age,"岁",sep = "")wj_1.infor()

5.2 @staticmethod

  • 经常有一些跟类有关系的功能,但在运行时又不需要实例和类参与的情况下,
  • 需要用到静态方法,比如更改环境变量或者修改其它类的属性等能用到静态方法,
  • 实例或者类都能调用该方法
class wj_2(object):def __init__(self):self.name_ = "李四"self.age_ = 25name = "张三"age = 18@staticmethoddef update_name():wj_2.name = "王二"
print(wj_2.name)
wj_2.update_name()
print(wj_2.name)
  • 1、@staticmethod 不需要表示自身对象的self参数,也不需要表示自身类的参数class_object,就和使用函数一样
  • 2、@classmethod不需要self,但是需要class_object
class wj_ensemble(object):sign = "a处"def __init__(self):self.sign = "b处"@classmethoddef func_class(class_obj):print(class_obj.sign)@staticmethoddef func_static():print(wj_ensemble.sign)def func_usual(self):print(self.sign)
# 实例运行普通类函数
wj_ensemble().func_usual()
# 类运行普通类函数
try:wj_ensemble.func_usual
except Exception as error:print("类不能调用普通函数")
# 类调用@classmethod装饰的方法
wj_ensemble.func_class()# 实例不能调用@classmethod装饰的方法
wj_ensemble().func_class()# 静态函数都可以调用
wj_ensemble.func_static()
wj_ensemble().func_static()

5.3 @property

使用此装饰器以后,实例可以把方法当属性来调用,也就是无法对属性赋值使用,@property最主要的目的是使得对私有属性无法修改

class wj_3(object):def __init__(self):self.__name__ = "玫瑰少年"@propertydef name(self):return self.__name__
wj_3().name

6、属性的分类

6.1 实例的属性

  • 1、在def __ init __(self)中初始化
  • 2、内部调用使用self.property
  • 3、外部调用使用instance.property

6.2 类属性

  • 1、在def __ init __(self)外初始化
  • 2、内部调用:classname.property
  • 3、外部调用:classname.property 或者 instance.property

6.3 类属性

  • 1、单下划线开头,只是告诉别人这是私有属性,外部依旧可以更改
  • 2、双下划线开头,不可用实例来更改

python —— 装饰器相关推荐

  1. python简单装饰器_简单介绍Python装饰器(一)

    装饰器的作用 相信大家在 探索过程中已经了解装饰器的作用,也有很多花里胡哨的介绍. 这次小冰也来讲解一下关于Python装饰器的一些小知识. 它的作用: 性能测试 日志 安全验证 ...... 相信大 ...

  2. Python装饰器的神奇功能:自动打印每个方法耗时

    问题: 运行代码时,尤其对于大型项目需要分析每个环节方法耗时的.每个方法前后都写计算耗时及日志打印太繁琐了,而且代码不精简. 解决: Python装饰器类似于Spring的 AOP(Aspect Or ...

  3. python装饰器教学_Python装饰器学习(九步入门)

    这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次 ...

  4. 简单介绍python装饰器

    这篇文章简单介绍一下python装饰器,希望对你们有所帮助. 简单正常python例子: def up(text):return text.upper() #转成大写 def lo(text):ret ...

  5. Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能

    Python装饰器是什么?使用Python装饰器实现计算程序(函数)运行时间的功能 目录

  6. python 装饰器示例

    python 装饰器示例 import timedef decorator(func): # 传函数def wrapper(*args, **kwargs): # 传参数(也可以传固定参数)start ...

  7. [转]python 装饰器

    以前你有没有这样一段经历:很久之前你写过一个函数,现在你突然有了个想法就是你想看看,以前那个函数在你数据集上的运行时间是多少,这时候你可以修改之前代码为它加上计时的功能,但是这样的话是不是还要大体读读 ...

  8. python装饰器与闭包_Python 装饰器和闭包

    Python 装饰器和闭包 装饰器是 Python 中常见的语法糖,这篇文章讲了闭包和装饰器的原理,并且分析了函数中变量的作用域,以及尝试总结了常见的坑. 装饰器基础 首先来看看装饰器的定义:装饰器本 ...

  9. 利用世界杯,读懂 Python 装饰器

    Python 装饰器是在面试过程高频被问到的问题,装饰器也是一个非常好用的特性, 熟练掌握装饰器会让你的编程思路更加宽广,程序也更加 pythonic. 今天就结合最近的世界杯带大家理解下装饰器. 德 ...

  10. Python 装饰器记录总结 (终极版)

    Python 装饰器记录总结 (终极版) 原文链接:http://magicroc.com/2017/04/10/Python装饰器记录总结/ 装饰器是一个函数,一个用来包装函数的函数,装饰器在函数申 ...

最新文章

  1. MapReduce的方式进行HBase向HDFS导入和导出
  2. 集成电路pad指的是什么_芯片、半导体、集成电路,你分清楚了吗?
  3. C#水晶报表,窗体不显示,闪退
  4. 后会终无期,且行且珍惜
  5. [网络收集]LINUX磁盘挂载mount和共享
  6. 如何在Kubernetes容器环境下部署Spinnaker?
  7. swift4.1 系统学习十 函数
  8. html5 Canvas 绘制基本图形 从直线图形到使用路径 - 直线、矩形、路径、多边形、复杂组合图形
  9. wincc 写入mysql,WINCC读写SQL数据库的示例
  10. 数据降维(PCA、因子分析法)
  11. 网易邮箱(126/163):授权码获取攻略
  12. 带sex的net域名_域名劫持的几种方法、域名劫持有什么方式
  13. Nvidia显卡驱动下载
  14. 连续时间周期信号傅里叶级数
  15. 编译原理复习(4)语法分析--自上而下分析
  16. Android Studio 代理问题总结(Gradle代理,模拟器代理)
  17. java中的tomcatserverlet
  18. OpenGL超级宝典学习笔记——操作矩阵
  19. 在excel中某些单元格内批量增加相同的内容
  20. mybatis黑马:一级缓存和二级缓存

热门文章

  1. spring boot实战(第十篇)Spring boot Bean加载源码分析
  2. 数据库外键的使用原则
  3. 处理被中断的系统调用
  4. 【Python】青少年蓝桥杯_每日一题_7.11_画太阳
  5. Python for else 的使用(银行账号的登录)
  6. 鸿蒙发布的意义,华为鸿蒙正式发布!“鸿蒙”是什么意思?
  7. 推进大数据中心新能源应用 广东省六部门联合印发培育新能源战略性新兴产业集群行动计划(2021—2025年)...
  8. 广东移动数据中心攻关“液/气双通道散热技术”
  9. 浓烟滚滚!某市联通集体断网,谁的锅?
  10. Database之SQLSever:SQLSever基础知识进阶、软件安装注意事项、软件使用经验总结之详细攻略