Python进阶-----类的装饰器及应用

回顾什么是装饰器:
  装饰器定义:本质就是函数(高阶函数),功能是为其他函数(对象)添加新功能

一、类的装饰器基本实现原理如下:

1 def deco(cls):
2     print(‘类的装饰器=========》‘)
3     print(‘=‘*20)
4     return cls
5
6 @deco      #====> Foo = deco(Foo)
7 class Foo:
8     pass

二、上述的简单装饰器是没有参数的,现在我们加上参数

 1 def cls_decorator(**kwargs):            #支持传入参数(属性和对应的值),字典形式
 2     def deco(cls):
 3         for key,val in kwargs.items():
 4             setattr(cls,key,val)        #给类设置对应的属性和值
 5         return cls
 6     return deco
 7
 8 @cls_decorator(name=‘Menawey‘,age=24,gender=‘male‘)        # 1 运行cls_decorator(...),返回deco;2 @deco===> Peolple = deco(People)
 9 #相当于给People类设置了name、age、gender属性
10 class People:
11     pass
12
13 print(People.__dict__)                                   #查看被装饰过的类的属性字典

   通过这样就可以动态的给不同的类在他实例化前增加属性

三、结合描述符
  通过描述符和类的装饰器组合使用,可以完成很多功能,比如为类添加属性,并且可以限定属性的类型。

 1 #描述符
 2 class Desc:
 3     def __init__(self,key,value_type):
 4         self.key = key
 5         self.value_type = value_type
 6     def __get__(self, instance, owner):
 7         return instance.__dict__[self.key]
 8     def __set__(self, instance, value):
 9         if not isinstance(value,self.value_type):
10             raise TypeError(‘%s 传入的类型不是 %s‘%(self.key,self.value_type))
11         instance.__dict__[self.key] = value
12     def __delete__(self, instance):
13         instance.__dict__.pop(self.key)
14
15 #装饰器
16 def cls_decorator(**kwargs):            #支持传入参数(属性和对应的值),字典形式
17     def deco(cls):
18         for key,val in kwargs.items():    #这里需要用到描述符对属性进行代理,但是val是指定的类型,所以要用Desc(key,val)来描述为对应的值
19             setattr(cls,key,Desc(key,val))        #给类设置对应的属性和值
20         return cls
21     return deco
22
23 @cls_decorator(name=str,age=int,gender=str,salary=float)    #使用装饰器
24
25 #被装饰和描述的类
26 class People:
27     def __init__(self,name,age,gender,salary):
28         self.name = name
29         self.age = age
30         self.gender = gender
31         self.salary = salary
32
33 p1 = People(‘Menawey‘,24,‘male‘,11.1)  #因为gender属性指定的是sstr,但是TypeError: age 传入的类型不是 <class ‘int‘>
34 print(People.__dict__)

原文地址:https://www.cnblogs.com/Meanwey/p/9901998.html

时间: 2024-11-08 17:31:54

Python进阶-----类的装饰器及应用的相关文章

【python】-- 类的装饰器方法、特殊成员方法

装饰器方法 类的另外的特性,装饰器方法:静态方法(staticmethod).类方法(classmethod).属性方法(property) 一.静态方法 在方法名前加上@staticmethod装饰器,表示此方法为静态方法 class Dog(object): def __init__(self,name): self.name = name @staticmethod #在方法前加上staticmethod 装饰器定义静态方法 def eat(): print("dog is eating&

python - 用类写装饰器

这里用到了__call__的class内置参数 #类装饰器: class zsq(): #本质是定义一个参数,让装饰的主题传递至__call__方法内部 def __init__(self,obj): self.obj = obj #利用__call__将类转变为可执行 #__call__内相当于函数装饰器最外层 def __call__(self, *args, **kwargs): print("start") #返回主机函数 re = self.obj(*args, **kwar

Python之旅的第28天(描述符、类的装饰器)

周末真好,时间充裕,都能按照要求自己练习,感觉就是好 一.描述符 上次针对描述符的内容,理解的非常不到位,所以我就特地找了新的内容好好看了看,总结一下就是下面这些 # 前天我大概知道类描述符的一些特性,以及什么是数据描述符和非数据描述符 # 今天白天没事琢磨了一下,顺便又看了看各种案例,貌似理解更深入了一些 # 数据描述符:就是这个类属性是由一个实现了__get__(),__set__(),__delete__()中方法的新式类搞定了 # 非数据描述符则是,没有__set__方法的 # 当时没有

19 描述符应用 与类的装饰器

上下文管理协议 class Open: def __init__(self,name): self.name = name def __enter__(self): print('执行enter') def __exit__(self, exc_type, exc_val, exc_tb): print('执行exit') with Open('a.txt') as f: print(f) print('______') print('00000') with open 执行了enter f为e

python高级编程之装饰器04

from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #with和contextlib #对于要确保即使发生一个错误时也能运行一些清理代码而言,try...finally语句很有用,对以下场景,如: """ 关闭一个文件, 释放一个锁 创建一个临时代码补丁 在特殊环境中运行受保护代码 ----------- with语句覆盖

Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. 先定义一个基本的装饰器: ########## 基本装饰器 ########## def orter(func):    #定义装饰器     de

python高级编程之装饰器01

# -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #装饰器01 #特点是:使得函数和方法封装(接收一个函数并返回增强版本一个函数) #语法:原始场景可以将方法 在定义首部将其定义为类方法或者静态方法,在未使用装饰器之前,语法如下: class WhatFort(object): def it(cls): print 'work with %s:'%cls it=classmethod(it) def uncommo

Python学习笔记012——装饰器

1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函数,函数装饰类,类装饰函数,类装饰类(两者不是一一对应关系,其实我也不知道他们之间是什么样的对应关系) 一般而言,主要应用的是函数装饰函数 1.3 装饰器本质 本质上,decorator就是一个返回函数的高阶函数. 在面向对象(OOP)的设计模式中,decorator被称为装饰模式.OOP

用类作为装饰器装饰函数!

在python中我们可以利用一个函数作为装饰器来装饰另一个函数,但是装饰器只能是函数吗 ?当然了我们还可以使用类来作为装饰器! class A(object): def __init__(self,func): print('定义初始化函数') print('func name is %s'%func.__name__) self.__func = func def __call__(self): print('call 方法作为装起中的功能') self.__func() print('增加的