一.定义
装饰器就是一个给对象添加额外功能的函数,其本质是函数。它的基本构造:高阶函数+函数嵌套+闭包。基础知识讲解详见:https://blog.51cto.com/10836356/2095118
二.简单类的装饰器
我们先看简单的类的装饰器,如果我们需要给任意一个类添加一个打印功能,即:没当操作这个类时,就打印”定义了一个装饰类函数”,见下图:

@Decorator #相当于执行 School = Decorator(School)
注释内容若有疑问,请参考:https://blog.51cto.com/10836356/2095118
上面代码块为:

#给每个类打印一句话
def Decorator(obj):print("定义了一个装饰器函数")return obj@Decorator          #相当于执行 School = Decorator(School)
class School():pass
            如果我们要给该类添加一个数据属性和一个函数属性,又该如何定义这个装饰器呢?见下图:


代码块如下:

#给每个类添加一个数据属性和一个函数属性
def Decorator(obj):# print(School.__dict__)#添加数据属性obj.addr = "浙江省杭州市"def price():pass#添加函数属性obj.price = pricereturn obj@Decorator          #相当于执行 School = Decorator(School)
class School():def __init__(self,name,price):self.name =nameself.price =price#打印类的属性字典
print(School.__dict__)

三.高级类的装饰器
此时,在实际场景中可能需要在装饰器中使用变量参数,那么该如何实现呢?
在二中只利用了装饰器中的高阶函数的概念,要实现上述的需求,就需要使用装饰器构造的另外两部分:函数嵌套、闭包。如下图所示,我们需要给类添加一个数据属性,但是此时不同的类要求添加的属性是可变的,处理方法见下图:

多个类使用该装饰器添加不同的属性,如下图:

该部分代码块如下:

#给每个类添加一个可变的数据属性
def Decorator(**kwargs):def add(obj):"添加数据属性"# print('调用外部函数的**kwargs',kwargs)for key,val in kwargs.items():# 添加数据属性setattr(obj,key,val)return obj# print("外部传入的参数为:",kwargs)return add@Decorator(addr = "浙江省杭州市",name ="浙江大学")          #执行顺序:1.运行Decorator函数,先打印外部的传入的参数,返回add函数名;2.再执行School = add(School)
class School():def __init__(self,price):self.price =price@Decorator(addr = "湖北省",price =12000)
class School1():passprint(School.__dict__)
print(School1.__dict__)

四.类的装饰器在实际中的应用
我们在学习类时,介绍了类的静态属性(参考https://blog.51cto.com/10836356/2108790),当时就猜测到,是利用的装饰器来完成该功能。那么到底是怎么实现的呢?见下文:

在上面的代码中,静态属性的属性是由python内部自己给我们实现的,那么到底它是怎么工作的呢?见下图:

此时我们还未进行实例化及调用类的静态属性,见下图:

我们可以看到,当进行实例化时,并没有明显差异,但是当调用类的total方法时,就会去调用Myproperty类中的get()方法(此处用到的是描述符优先级的知识,将另开篇幅讲解,此处直接应用),为达到理想的效果,我们只需在get()中进行处理就好,如下图进一步处理:

至此,该部分的功能已经完全实现。这就是python在为我们做的工作。那么我们已经理解了原理,这样我们就可以自定义类的其他装饰器。
该部分代码块如下:

class Myproperty():def __init__(self,fun):# print("执行Myproperty类的构造方法")   #调用Myproperty类时会首先运行它self.fun = fundef __get__(self, instance, owner):""":param instance: 代表school实例本身:param owner:  代表类School本身:return:"""# print('调用Myproperty的属性时将执行此方法')return  self.fun(instance)class School():"""@name:学校名字@addr:学校地址@price:学费@num:招生人数"""def __init__(self,name,addr,price,num):self.name =nameself.addr =addrself.price =priceself.num =num# @property@Myproperty    #等价于-->>total=Myproperty(total)def total(self):"求总的学费"return  self.price*self.numschool = School('浙江大学','浙江省杭州市',12000,6000)
print(school.total)

转载于:https://blog.51cto.com/10836356/2112490

python_类装饰器相关推荐

  1. python装饰器类-python_类装饰器

    一.定义 装饰器就是一个给对象添加额外功能的函数,其本质是函数.它的基本构造:高阶函数+函数嵌套+闭包.基础知识讲解详见:https://blog.51cto.com/10836356/2095118 ...

  2. python描述符(descriptor)、属性(property)、函数(类)装饰器(decorator )原理实例详解

    2019独角兽企业重金招聘Python工程师标准>>> 1.前言 Python的描述符是接触到Python核心编程中一个比较难以理解的内容,自己在学习的过程中也遇到过很多的疑惑,通过 ...

  3. python装饰器类-Python 装饰器、类装饰器、属性装饰器

    今天来介绍一下python的装饰器. 1.首先来介绍一下简单的装饰器, def play(): return "i can play" if __name__ == '__main ...

  4. python类装饰器详解-Python类中的装饰器在当前类中的声明与调用详解

    我的Python环境:3.7 在Python类里声明一个装饰器,并在这个类里调用这个装饰器. 代码如下: class Test(): xx = False def __init__(self): pa ...

  5. python类装饰器详解-Python类装饰器实现方法详解

    本文实例讲述了Python类装饰器.分享给大家供大家参考,具体如下: 编写类装饰器 类装饰器类似于函数装饰器的概念,但它应用于类,它们可以用于管理类自身,或者用来拦截实例创建调用以管理实例. 单体类 ...

  6. python装饰器类-python装饰器2:类装饰器

    本文是装饰器相关内容的第二篇,关于类装饰器. "类装饰器"有两种解读方式:用来装饰类的装饰器:类作为装饰器装饰其它东西.你如何认为取决于你,两种说法都有出现在其它的文章中.我的文章 ...

  7. python类装饰器详解-Python 类装饰器解析

    1. 类装饰器(都不带参数) class ClassDeco: def __init__(self, func): self.func = func def __call__(self, *args, ...

  8. python类装饰器详解-python 中的装饰器详解

    装饰器 闭包 闭包简单的来说就是一个函数,在该函数内部再定义一个函数,并且这个内部函数用到了外部变量(即是外部函数的参数),最终这个函数返回内部函数的引用,这就是闭包. def decorator(p ...

  9. python类装饰器详解-Python装饰器基础概念与用法详解

    本文实例讲述了Python装饰器基础概念与用法.分享给大家供大家参考,具体如下: 装饰器基础 前面快速介绍了装饰器的语法,在这里,我们将深入装饰器内部工作机制,更详细更系统地介绍装饰器的内容,并学习自 ...

  10. python装饰器类-Python类装饰器

    上次介绍了Python的函数装饰器,这次我们来讲一讲Python的类装饰器. Python的类装饰器基本语法如下: defdecorator(cls):print "6666666" ...

最新文章

  1. linux驱动编程入门实例
  2. 详解IIS中URL重写工具的规则条件(Rule conditions)
  3. 杨柳目-杨柳科-Info-新闻:注意了!杨絮解决有办法了
  4. ansible安装配置及实例
  5. 农村信用社招聘考试计算机,农村信用社招聘考试题:计算机(一)
  6. .NET Core TDD 前传: 编写易于测试的代码 -- 依赖项
  7. 产品认知:产品经理需要具备哪些核心竞争力?
  8. rust睡觉按键没反应_腐蚀Rust有哪些实用操作 腐蚀Rust实用操作汇总-游侠网
  9. Ref和Out关键字的区别
  10. JDBC 8.0 和 JDBC 5.0 区别
  11. 分享功能 集成友盟分享
  12. vivo安装android wear,vivo谷歌框架下载-vivo谷歌服务框架v4.1.2 安卓版 - 极光下载站...
  13. 邮件营销和网络广告的价值
  14. Flutter 报错:Could not resolve io.flutter:flutter_embedding_debug:1.0.0-ee76268252c22f5c11e82a7b87423c
  15. 计算机械产值,装配式建筑的蓬勃发展中起重机械设备租赁行业的发展空间有多大??有没有每年的产值增速测算呢??...
  16. HTML5/CSS3 炫酷键盘 不规则布局 内含知识点总结
  17. python绘制条形图 中文横坐标_python3使用matplotlib绘制条形图
  18. JavaScript期末大作业 罗兰永恒花园动漫价绍网页 7页,含有table表格,js表单验证还有首页视频
  19. python numpy 实现与(and),非与(not),或(or),异或(xor)逻辑运算!
  20. 硬件电路之高压爬电距离

热门文章

  1. MySQL 常用分库分表方案,都在这里了!
  2. 感谢这几个公众号,已拿今日头条,蚂蚁金服Offer
  3. 百度App网络深度优化系列《一》DNS优化
  4. 输电线路巡检机器人PPT_国网泰安供电公司开展输电线路无人机精细化巡检
  5. 人工智能python的缺点_浅谈人工智能的优缺点及使用环境
  6. 多个项目共用同一个redis_比Redis快5倍的中间件,为啥这么快?
  7. 威海二职工业机器人专业_工业机器人专业主要学什么?
  8. html与js简单小游戏,使用js写了一个特别简单的小游戏
  9. oracle get wkt,Bing Maps开发扩展:Oracle Spatial的空间数据渲染
  10. java线程条件变量_Java线程:条件变量 lock