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

Python装饰器高级版—Python类

高级Python 2023-01-31 02:01:37 890人浏览 独家记忆

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

摘要

本文重点:解决了类里面定义的装饰器,在同一个类里面使用的问题,并实现了装饰器的类属性参数传递目录:一、基本装饰器二、在类里定义装饰器,装饰本类内函数三、类装饰器正文:一、基本装饰器        装饰不带参数的函数def clothes(f

本文重点:解决了类里面定义的装饰器,在同一个类里面使用的问题,并实现了装饰器的类属性参数传递


目录:

一、基本装饰器

二、在类里定义装饰器,装饰本类内函数

三、类装饰器



正文:

一、基本装饰器

        装饰不带参数的函数

def clothes(func):
    def wear():
        print('Buy clothes!{}'.fORMat(func.__name__))
        return func()
    return wear

@clothes
def body():
    print('The body feels could!')
    
#备注:@是语法糖
# 不用语法糖的情况下,使用下面语句也能实现装饰作用:把body再加工,再传给body
# body = clothes(body)

        装饰带一个参数的函数

def clothes(func):
    def wear(anything):            # 实际是定义一个anything参数,对应body函数参数
        print('Buy clothes!{}'.format(func.__name__))
        return func(anything)      # 执行func函数,并传入调用传入的anything参数
        # wear = func(anything)    # 在这一步,实际上可以看出来,为啥wear必须带参数,因为它就是func(anything)
    return wear
    # 所以clothes的结果是
    # clothes = wear = func(anything)
    # 不用语法糖的情况下就是
    # body = clothes(body)('hands')
    # 进一步证明:print(body.__name__)  显示的是wear函数
    
@clothes
def body(part):
    print('The body feels could!{}'.format(part))
    
body('hands')

    装饰带不定长参数的函数

    通常装饰器不只装饰一个函数,每个函数参数的个数也不相同

    这个时候使用不定长参数*args,**kwargs

def clothes(func):
    def wear(*args, **kwargs):
        print('Buy clothes!{}'.format(func.__name__))
        return func(*args, **kwargs)
    return wear

@clothes
def body(part):
    print('The body feels could!{}'.format(part))

@clothes
def head(head_wear, num=2):
    print('The head need buy {} {}!'.format(num, head_wear))
body('hands')
head('headdress')

    装饰器带参数

# 把装饰器再包装,实现了seasons传递装饰器参数。

def seasons(season_type):
    def clothes(func):
        def wear(*args, **kwargs):
            if season_type == 1:
                s = 'spring'
            elif season_type == 2:
                s = 'summer'
            elif season_type == 3:
                s = 'autumn'
            elif season_type == 4:
                s = 'winter'
            else:
                print('The args is error!')
                return func(*args, **kwargs)
            print('The season is {}!{}'.format(s, func.__name__))
            return func(*args, **kwargs)
        return wear
    return clothes

@seasons(2)
def children():
    print('i am children')

children()




二、在类里定义装饰器,装饰本类内函数:

        类装饰器,装饰函数和类函数调用不同的类函数

    把装饰器写在类里

        在类里面定义个函数,用来装饰其它函数,严格意义上说不属于类装饰器。

class Buy(object):
    def __init__(self, func):
        self.func = func

    # 在类里定义一个函数
    def clothes(func):            # 这里不能用self,因为接收的是body函数
        # 其它都和普通的函数装饰器相同
        def ware(*args, **kwargs):
            print('This is a decrator!')
            return func(*args, **kwargs)
        return ware



@Buy.clothes
def body(hh):
    print('The body feels could!{}'.format(hh))

body('hh')

    装饰器装饰同一个类里的函数

    背景:想要通过装饰器修改类里的self属性值。

class Buy(object):
    def __init__(self):
        self.reset = True        # 定义一个类属性,稍后在装饰器里更改
        self.func = True         

    # 在类里定义一个装饰器
    def clothes(func):    # func接收body
        def ware(self, *args, **kwargs):    # self,接收body里的self,也就是类实例
            print('This is a decrator!')
            if self.reset == True:        # 判断类属性
                print('Reset is Ture, change Func..')
                self.func = False        # 修改类属性
            else:
                print('reset is False.')

            return func(self, *args, **kwargs)

        return ware

    @clothes
    def body(self):
        print('The body feels could!')

b = Buy()    # 实例化类
b.body()     # 运行body
print(b.func)    # 查看更改后的self.func值,是False,说明修改完成

三、类装饰器

    定义一个类装饰器,装饰函数,默认调用__call__方法

# 
class Decrator(object):
    def __init__(self, func):                        # 传送的是test方法
        self.func = func

    def __call__(self, *args, **kwargs):      # 接受任意参数
            print('函数调用CALL')
            return self.func(*args, **kwargs)    # 适应test的任意参数        

@Decrator                        # 如果带参数,init中的func是此参数。
def test(hh):
    print('this is the test of the function !',hh)
test('hh')

    定义一个类装饰器,装饰类中的函数,默认调用__get__方法

    实际上把类方法变成属性了,还记得类属性装饰器吧,@property

    下面自已做一个property

class Decrator(object):
    def __init__(self, func):
        self.func = func

    def __get__(self, instance, owner):
        '''
        instance:代表实例,sum中的self
        owner:代表类本身,Test类
        
        '''
        print('调用的是get函数')
        return self.func(instance)     # instance就是Test类的self


class Test(object):
    def __init__(self):
        self.result = 0

    @Decrator
    def sum(self):
        print('There is the Func in the Class !')

t = Test()
print(t.sum)            # 众所周知,属性是不加括号的,sum真的变成了属性

    做一个求和属性sum,统计所有输入的数字的和

class Decrator(object):
    def __init__(self, func):
        self.func = func

    def __get__(self, instance, owner):
        print('调用的是get函数')
        return self.func(instance)

class Test(object):
    def __init__(self, *args, **kwargs):
        self.value_list = []
        if args:
            for i in args:
                if str(i).isdigit():
                    self.value_list.append(i)
        if kwargs:
            for v in kwargs.values():
                if str(v).isdigit():
                    self.value_list.append(v)
    @Decrator
    def sum(self):
        result = 0
        print(self.value_list)
        for i in self.value_list:
            result += i

        return result
t = Test(1,2,3,4,5,6,7,8,i=9,ss=10,strings = 'lll')

print(t.sum)

    



--结束END--

本文标题: Python装饰器高级版—Python类

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

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

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

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

下载Word文档
猜你喜欢
  • Python装饰器高级版—Python类
    本文重点:解决了类里面定义的装饰器,在同一个类里面使用的问题,并实现了装饰器的类属性参数传递目录:一、基本装饰器二、在类里定义装饰器,装饰本类内函数三、类装饰器正文:一、基本装饰器        装饰不带参数的函数def clothes(f...
    99+
    2023-01-31
    高级 Python
  • python3--装饰器高级学习版
    __author__ = "Aaron Fan"import time #导入time模块user,passwd = 'alex','abc123'   #用户名密码def auth(auth_type):    #创建auth函数,创建a...
    99+
    2023-01-31
    高级
  • python装饰器2:类装饰器
    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 本文是装饰器相关内容的第二篇,关于类装饰器。 "类装饰器"有两种解读方式:用来装饰类的装饰器;类作为装饰器装饰其它东西。你如何认为取决于你,两种说法都有出现在其它的文章中。我的...
    99+
    2023-01-30
    python
  • Python——编写类装饰器
    编写类装饰器类装饰器类似于函数装饰器的概念,但它应用于类,它们可以用于管理类自身,或者用来拦截实例创建调用以管理实例。 -----------------------------------------------------------...
    99+
    2023-01-31
    Python
  • python高级编程-Part3 修饰器
        修饰器用来包装函数,增加额外的功能,而且应能够修饰一批函数,减少代码重用。    简单的修饰器        一个函数接收函数对象作为参数,并且返回函数对象,这样的函数可以成为一个修饰器,形如下面的定义:def deco(func)...
    99+
    2023-01-31
    高级编程 python
  • Python装饰器与类的装饰器怎么实现
    这篇“Python装饰器与类的装饰器怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python装饰器与类的装饰器怎么...
    99+
    2023-06-29
  • python高级语法之闭包和装饰器详解
    目录一、闭包二、一个简单的例子三、装饰器3.1 简单装饰器3.1.1 使用装饰器的语法糖3.1.2 装饰器的执行时机3.2 通用装饰器3.2.1 装饰带有参数的函数3.2.2. 装饰...
    99+
    2024-04-02
  • 探索 Python 高级特性:从类和对象到装饰器和生成器
    1. 类和对象 类和对象是 Python 中面向对象编程 (OOP) 的核心概念。类是一种数据类型,用于创建具有相同属性和行为的对象。对象是类的实例,可以访问类定义的属性和方法。 class Person: def __init__(...
    99+
    2024-02-06
    Python 高级特性 对象 装饰器 生成器
  • Python函数高级(命名空间、作用域、装饰器)
    目录一、名称空间和作用域1、命名空间(Namespace)1、一般有三种命名空间:2、命名空间查找顺序:3、命名空间的生命周期:2、作用域:3、全局变量和局部变量4、函数对象+作用域...
    99+
    2024-04-02
  • Python学习之装饰器与类的装饰器详解
    目录装饰器装饰器的定义装饰器的用法类中的装饰器类的装饰器 - classmethod类的装饰器 - staticmethod类的装饰器 - property通过学习装饰器可以让我们更...
    99+
    2024-04-02
  • python装饰器
    什么是装饰器:   装饰器就是python中的一个语法糖。作用就是在不改动之前代码的情况下给某个函数增加相应想要增加的功能。 假设需求:   我在几个函数内分别放了一部电影,代码如下: 1 def mv1(): 2 print(...
    99+
    2023-01-30
    python
  • python-装饰器
    装饰器简介:给被装饰的函数在不更改代码的基础上增加新的功能;多个装饰器的执行顺序:从最靠近原始函数的装饰器开始执行,最后执行原始函数; 直接上个简单的例子就懂了: 一 最简单的装饰器:#!/usr/bin/python def deco(f...
    99+
    2023-01-31
    python
  • python 装饰器
    装饰器本质上是一个Python函数,它可以让其他函数在不雲要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。它经常用于有切面雲求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳...
    99+
    2023-01-30
    python
  • Python之装饰器
    在Python中一切皆对象,函数是一等对象。这意味着可以通过名字引用函数。>>> a=123 >>> a 123 >>> name='zeng' >>> name 'z...
    99+
    2023-01-31
    Python
  • 如何在python中使用类装饰器
    这篇文章将为大家详细讲解有关如何在python中使用类装饰器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。python有哪些常用库python常用的库:1.requesuts;2.scrap...
    99+
    2023-06-14
  • 带参数的全类型 Python 装饰器
    这篇短文中显示的代码取自我的小型开源项目按合同设计,它提供了一个类型化的装饰器。装饰器是一个非常有用的概念,你肯定会在网上找到很多关于它们的介绍。简单说,它们允许在每次调用装饰函数时(之前和之后)执行代码。通过这种方式,你可以修改函数参数或...
    99+
    2023-05-14
    Python 装饰器
  • Python装饰器详情
    目录1、装饰器1.1 应用场景2、万能装饰器3、多层装饰器4、带参数的装饰器1、装饰器 装饰器(Decorator):从字面上理解,就是装饰对象的器件。可以在不修改原有代码的情况下,...
    99+
    2024-04-02
  • python装饰器1:函数装饰器详解
    装饰器1:函数装饰器 装饰器2:类装饰器 装饰器3:进阶 先混个眼熟 谁可以作为装饰器(可以将谁编写成装饰器): 函数 方法 实现了__call__的可调用类 装饰器可以去装饰谁(谁可以被装饰): 函数 方法 类 基础...
    99+
    2023-01-30
    详解 函数 python
  • Python小知识 - Python装饰器
    Python装饰器 在Python中,装饰器是一个特殊的函数,可以将其他函数包装在装饰器函数中,并且将被包装的函数作为参数传递给装饰器函数。 使用装饰器的好处是可以自动在被包装的函数前后执行一...
    99+
    2023-09-13
    Python YYDS
  • python装饰器进阶
    目录 装饰器进阶 1. 被装饰的函数有多个参数。 2. 被装饰的函数有返回值 3.在函数中嵌入装饰器 4. 装饰器类 ...
    99+
    2023-01-30
    进阶 python
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作