iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python_类装饰器
  • 784
分享到

python_类装饰器

2023-01-31 06:01:02 784人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

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

一.定义
装饰器就是一个给对象添加额外功能的函数,其本质是函数。它的基本构造:高阶函数+函数嵌套+闭包。基础知识讲解详见:https://blog.51cto.com/10836356/2095118
二.简单类的装饰器
我们先看简单的类的装饰器,如果我们需要给任意一个类添加一个打印功能,即:没当操作这个类时,就打印”定义了一个装饰类函数”,见下图:
python_类装饰器
@Decorator #相当于执行 School = Decorator(School)
注释内容若有疑问,请参考:Https://blog.51cto.com/10836356/2095118
上面代码块为:

#给每个类打印一句话
def Decorator(obj):
    print("定义了一个装饰器函数")
    return obj

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

python_类装饰器
代码块如下:

#给每个类添加一个数据属性和一个函数属性
def Decorator(obj):# print(School.__dict__)
    #添加数据属性
    obj.addr = "浙江省杭州市"
    def price():
        pass
    #添加函数属性
    obj.price = price
    return obj

@Decorator          #相当于执行 School = Decorator(School)
class School():
    def __init__(self,name,price):
        self.name =name
        self.price =price

#打印类的属性字典
print(School.__dict__)

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

#给每个类添加一个可变的数据属性
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():
    pass

print(School.__dict__)
print(School1.__dict__)

四.类的装饰器在实际中的应用
我们在学习类时,介绍了类的静态属性(参考https://blog.51cto.com/10836356/2108790),当时就猜测到,是利用的装饰器来完成该功能。那么到底是怎么实现的呢?见下文:
python_类装饰器
在上面的代码中,静态属性的属性是由python内部自己给我们实现的,那么到底它是怎么工作的呢?见下图:
python_类装饰器
此时我们还未进行实例化及调用类的静态属性,见下图:
python_类装饰器
我们可以看到,当进行实例化时,并没有明显差异,但是当调用类的total方法时,就会去调用Myproperty类中的get()方法(此处用到的是描述符优先级的知识,将另开篇幅讲解,此处直接应用),为达到理想的效果,我们只需在get()中进行处理就好,如下图进一步处理:
python_类装饰器
至此,该部分的功能已经完全实现。这就是Python在为我们做的工作。那么我们已经理解了原理,这样我们就可以自定义类的其他装饰器。
该部分代码块如下:

class Myproperty():
    def __init__(self,fun):
        # print("执行Myproperty类的构造方法")   #调用Myproperty类时会首先运行它
        self.fun = fun
    def __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 =name
        self.addr =addr
        self.price =price
        self.num =num
    # @property
    @Myproperty    #等价于-->>total=Myproperty(total)
    def total(self):
        "求总的学费"
        return  self.price*self.num

school = School('浙江大学','浙江省杭州市',12000,6000)
print(school.total)

--结束END--

本文标题: python_类装饰器

本文链接: https://www.lsjlt.com/news/190546.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python_类装饰器
    一.定义装饰器就是一个给对象添加额外功能的函数,其本质是函数。它的基本构造:高阶函数+函数嵌套+闭包。基础知识讲解详见:https://blog.51cto.com/10836356/2095118二.简单类的装饰器我们先看简单的类的装饰器...
    99+
    2023-01-31
  • python装饰器2:类装饰器
    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 本文是装饰器相关内容的第二篇,关于类装饰器。 "类装饰器"有两种解读方式:用来装饰类的装饰器;类作为装饰器装饰其它东西。你如何认为取决于你,两种说法都有出现在其它的文章中。我的...
    99+
    2023-01-30
    python
  • 类装饰器
      在理解类装饰器之前,先回忆一下有关装饰器的知识。装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的引用)。   __call__方法  一个对象是否可调用,看...
    99+
    2023-01-30
  • Python装饰器与类的装饰器怎么实现
    这篇“Python装饰器与类的装饰器怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python装饰器与类的装饰器怎么...
    99+
    2023-06-29
  • Python——编写类装饰器
    编写类装饰器类装饰器类似于函数装饰器的概念,但它应用于类,它们可以用于管理类自身,或者用来拦截实例创建调用以管理实例。 -----------------------------------------------------------...
    99+
    2023-01-31
    Python
  • Python学习之装饰器与类的装饰器详解
    目录装饰器装饰器的定义装饰器的用法类中的装饰器类的装饰器 - classmethod类的装饰器 - staticmethod类的装饰器 - property通过学习装饰器可以让我们更...
    99+
    2024-04-02
  • Python装饰器高级版—Python类
    本文重点:解决了类里面定义的装饰器,在同一个类里面使用的问题,并实现了装饰器的类属性参数传递目录:一、基本装饰器二、在类里定义装饰器,装饰本类内函数三、类装饰器正文:一、基本装饰器        装饰不带参数的函数def clothes(f...
    99+
    2023-01-31
    高级 Python
  • Python_类的属性
    1.类属性分类类的属性分为:数据属性:就是类中的变量;函数属性:就是类中函数,在面向对象设计中通常称为方法;类和对象的属性均使用点(.)来访问自己的属性2.类的属性类的定义与函数极其相似,我们可以使用函数的作用域来理解类的属性调用方式...
    99+
    2023-01-31
    属性
  • Python_安装pycap
    pycap:http://code.google.com/p/pypcap/ sendpkt:http://code.google.com/p/sendpkt/ dpkt:http://code.google.com/p/dpkt/   ...
    99+
    2023-01-31
    pycap
  • 装饰器
    def wrapper(func):   def inner(args*,**kwargs):     ret = func(args*,**kwargs)     return ret   return inner @wrapper d...
    99+
    2023-01-30
  • Angular中的类装饰器有哪些
    这篇文章主要介绍了Angular中的类装饰器有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。angular共有5种类装饰器,表明每个类的...
    99+
    2024-04-02
  • Python_类的继承
    1.类的继承关系和生活中父亲、儿子、孙子之间的关系一样,Python中若A类继承B类,则A类称之为子类,B类称之为父类(也称为基类)。2.类的继承方式分为:单继承、多继承两种;类的单继承是指,A类只继承一个父类B,如下图所示:类的多继承是指...
    99+
    2023-01-31
  • Python_类的组合
    A类与B类之间没有共同点,但是A类与B类之间有关联,比如说,医院类与患者类是两个完全不同的类,他们之间没有任何关联,但是患者是属于医院的。此时我们就要用到类的组合来关联医院类与患者类。详细操作详见下图:该部分代码为: class Hospi...
    99+
    2023-01-31
    组合
  • python_字符串类型
    1、在python中用单引号' ',双引号'' '',三引号'''  ''' 标注字符串类型。 1 >>> name = "Alex Li" #双引号 2 >>> age = "22" #...
    99+
    2023-01-31
    字符串 类型
  • 如何在python中使用类装饰器
    这篇文章将为大家详细讲解有关如何在python中使用类装饰器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python有哪些常用库python常用的库:1.requesuts;2.scrap...
    99+
    2023-06-14
  • python装饰器1:函数装饰器详解
    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础...
    99+
    2023-01-30
    详解 函数 python
  • 带参数的全类型 Python 装饰器
    这篇短文中显示的代码取自我的小型开源项目按合同设计,它提供了一个类型化的装饰器。装饰器是一个非常有用的概念,你肯定会在网上找到很多关于它们的介绍。简单说,它们允许在每次调用装饰函数时(之前和之后)执行代码。通过这种方式,你可以修改函数参数或...
    99+
    2023-05-14
    Python 装饰器
  • python3 装饰器
    看廖雪峰官网的python3装饰器有感 装饰器即将一个函数作为变量在新的函数中调用此函数。 作业: 能否写出一个@log的decorator,使它既支持: @logdef f():     pass 又支持: @log('execut...
    99+
    2023-01-31
  • python3装饰器
    预备知识 首先我们要知道在python,一切皆对象,函数也是一个对象  >>> def test(): ... return "Hello World" 有自己的id值,有type,有自己的值 >>...
    99+
    2023-01-31
  • python装饰器
    什么是装饰器:   装饰器就是python中的一个语法糖。作用就是在不改动之前代码的情况下给某个函数增加相应想要增加的功能。 假设需求:   我在几个函数内分别放了一部电影,代码如下: 1 def mv1(): 2 print(...
    99+
    2023-01-30
    python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作