码迷,mamicode.com
首页 > 编程语言 > 详细

python_类装饰器

时间:2018-05-03 23:59:40      阅读:381      评论:0      收藏:0      [点我收藏+]

标签:python   类装饰器   python类装饰器   

一.定义
装饰器就是一个给对象添加额外功能的函数,其本质是函数。它的基本构造:高阶函数+函数嵌套+闭包。基础知识讲解详见:http://blog.51cto.com/10836356/2095118
二.简单类的装饰器
我们先看简单的类的装饰器,如果我们需要给任意一个类添加一个打印功能,即:没当操作这个类时,就打印”定义了一个装饰类函数”,见下图:
技术分享图片
@Decorator #相当于执行 School = Decorator(School)
注释内容若有疑问,请参考:http://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 = price
    return obj

@Decorator          #相当于执行 School = Decorator(School)
class School():
    def __init__(self,name,price):
        self.name =name
        self.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():
    pass

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

四.类的装饰器在实际中的应用
待完善

python_类装饰器

标签:python   类装饰器   python类装饰器   

原文地址:http://blog.51cto.com/10836356/2112490

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!