装饰器

  简介

  功能与格式

  内置装饰器

    @classmethod

    @propertry

    @staticmethod

  其它

---------------------------------------------------------------------------------------------------------------------------------

简        介

python中的解释器是你进入python大门的一道坎,不管你跨不跨过去它都在那里.

///装饰器本质上是一个python函数,他可以让其他函数在不需要任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.他经常用于有切面去求的场景,比如:插入日志,性能测试,事物处理,缓存,权限校验等场景,装饰器是结局这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用////

概括地说:装饰器的作用就是为已存在的函数或对象添加额外的功能

功能和格式

装饰器的主要功能:

在不改变函数调用方式的基础上再函数的前,后添加功能

装饰器的固定写法:

def timer(func):
def inner(*args,**kwargs):
'''执行函数之前要做的'''
re = func(*args,**kwargs)
'''执行函数之后要做的'''
return re
return inner

装饰器的固定格式

from functools import wraps

def deco(func):
@wraps(func) #加在最内层函数正上方
def wrapper(*args,**kwargs):
return func(*args,**kwargs)
return wrapper

装饰器的固定格式-----wraps版

@classmethod  装饰器

本质上:一个方法不用对象属性但是使用静态属性-----类方法

|||@classmethod,某一个方法被创造出来,就是为了进行静态变量进行操作,根本不涉及到对象,所以这个方法就是应该被定义成 ---类方法(@classmethod装饰) 调用这个方法可以使用对象调用,也可以使用类调用,但是这个方法的默认参数永远是当前的 命名空间,而不是对象的|||

将self改成了cls

class A:
__count = 0 # 隐藏了count属性
def __init__(self,name):
self.name = name
self.__add_count() # 每一次实例化的时候调
# 用私有方法来对__count进行累加
@classmethod
def __add_count(cls): # 定义一个私有的方法
# print(cls,A)
cls.__count += 1 # 让这个方法只能在类的内部被使用 @classmethod # 被classmethod装饰器装饰的方法,都有一个默认的参数,这个参数就是当前类
def show_count(cls): # 定义一个普通方法,
# print(cls,A)
return cls.__count # 让用户可以从外部查看__count的值 def eat(self):
print('%s在吃饭'%self.name)
print(A.show_count())
a = A('lufei')
print(alex.show_count())
b= A('suolong')
print(A.show_count())
A.eat(a) #结果
0
1
2
alex在吃饭

@staticmethod 装饰器

作用:调用时不用添加属性直接可以用

class Student:
def __init__(self):
# self :属于这个学生自己的一块空间
self.courses = [] @staticmethod
def show_courses(): # 不是查看已选课程,而是查看所有课程 -- 静态方法
# 不是操作学生对象本身空间中的数据,而是所有的学生这个方法的结果都是一样的
print('打开课程文件,一个一个读出来') def select_courses(self): # 选课 是一个对象方法(普通的方法)
self.courses.append('某一门课程') # 操作的课程一定是属于某一个对象 Student.show_courses()
alex = Student()
alex.show_courses()
              普通的方法           类方法             静态方法
默认参数 self cls 无
操作的变量 操作对象的属性 操作静态属性 既不操作对象属性,也不操作类的属性
所属的命名空间 类 类 类
调用方式 对象 类/对象 类/对象
对应的装饰器 无 @classmethod @staticmethod

上面两个装饰器的比较

---用哪一个命名空间中的名字,就定义不同的方法:

1)只要用self     就是普通方法    只能对象调

2)只要用cls       就是类方法        可以用类可以用对象

3)啥也不用        就是静态方法       可以用类可以用对象

@property  装饰器

作用:  把方法变成属性

from math  import pi
calss Circle:
def __init__(self,r):
self.r=r
@property #把一个方法伪装成属性,源代码有人写
def area(self):
return pi*self.r**2 d = Circle(10)
print(d.area) #把方法变成属性 #结果
314

其       它

1)最简单的装饰器

def a(func):
print(1)
print(2)
func()
print(3)
return b
@a
def c():
print(4) c() 运行过程:
先执行@a,得到一个1和函数的对象b, b和b()是不一样的,b只是一个对象,并不会运行,
然后运行c()的时候,执行b参数,得到2,func() 得到4,3 #结果:
1,2,4,3

2)当加入参数的装饰器

def a(func):
print(1)
def b(*args,**kwargs):
print(2)
func(*args,**kwargs)
print(3)
return b
@a
def c(a,b):
print(a+b)
c(3,4) 运行过程:
#args 将参数打包为tuple给函数使用(3,4)
#kwargs 将参数打包为dict给函数使用,将传入的a=1这样的参数变成{'a':1}
我们这里相当于a(c(a,b))这个函数
所以这里的b()其实就就相当于c() #结果:
1,2,7,3

python基础之内置装饰器的更多相关文章

  1. python设计模式之内置装饰器使用(四)

    前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...

  2. python基础-内置装饰器classmethod和staticmethod

    面向对象编程之classmethod和staticmethod classmethod 和 staticmethod都是python内置的装饰器 classmethod 的作用:给在类内部定义的方法装 ...

  3. python之内置装饰器(property/staticmethod/classmethod)

    python内置了property.staticmethod.classmethod三个装饰器,有时候我们也会用到,这里简单说明下 1.property 作用:顾名思义把函数装饰成属性 一般我们调用类 ...

  4. Python之内置装饰器property

    # -*- coding: utf-8 -*- # author:baoshan class Student(object): def __init__(self, name): self.name ...

  5. python基础-面向对象(装饰器)

    属性:   @property   @method_name.setter   @method_name.deleter   三个标签都是放在方法的上面来使用,且方法名要和后续使用的   变量名字相一 ...

  6. python基础之内置函数

    该博客内容参考http://www.cnblogs.com/wupeiqi/articles/4943406.html 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经 ...

  7. python基础5之装饰器

    内容概要: 一.装饰器前期知识储备 1.python解释函数代码过程: python解释器从上往下顺序解释代码,碰到函数的定义代码块不会立即执行它,而是将其放在内存中,等到该函数被调用时,才执行其内部 ...

  8. python基础篇_004_装饰器函数

    python装饰器函数 1.装饰器函数引导 功能:计算函数执行时长 import time """ 方式一: 函数首位添加时间,差值就是函数执行时间 缺点:每个函数都要加 ...

  9. python基础-函数之装饰器、迭代器与生成器

    1. 函数嵌套 1.1 函数嵌套调用 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数 def bar(): print("from in the bar.") def f ...

随机推荐

  1. windows 操作系统下git报filename too long 处理方法

    两种方法解决: 一是通过修改配置文件 [core] repositoryformatversion = filemode = false bare = false logallrefupdates = ...

  2. iview 中table列 一列显示多个数据(后台返回数组显示在列内)

    一.首先出现的是比较复杂的一种情况(多个key) 1.首先页面显示效果如下 2.后台返回数据格式如下: 3.在iview中table的columns中的render函数: 4.具体代码 render: ...

  3. LUOGU P2827 蚯蚓 (noip 2016)

    传送门 解题思路 第一眼以为是一个二叉堆,直接上优先队列60分...后来听ztz11说有单调性,新加入的蚯蚓一定比原先在的蚯蚓长度长,开三个队列,分别放原先的长度,切掉后大的那一半,切掉后小的那一半. ...

  4. win10 请求操作需要提升解决方案

    记录一下: win10   系统管理员 打开后缀为  .xxx 的文件时, 系统提示: 请求操作需要提升 网上搜索了一下,原因是权限不够,故系统提示. 给当前用户加入了 管理员权限,各种权限都无效. ...

  5. 实践中了解到的CSS样式的优先级

    CSS三大特性——继承.优先级和层叠.这是在精通CSS中重点强调的内容. 继承即子类元素继承父类的样式,常用的可继承样式有:color,font,line-height,list-style,text ...

  6. 灵动微本土MCU厂商具有吸引力的增长点

    作为各种电子产品的控制和处理核心,微控制单元(MCU)器件是一种集成微处理器(CPU).存储器(RAM/ROM).计数器,以及I/O端口的芯片.从MCU内核架构来看,单片机有历经多年的8051,基于A ...

  7. JavaScript--事件委托--冒泡

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 462. Minimum Moves to Equal Array Elements II

    Given a non-empty integer array, find the minimum number of moves required to make all array element ...

  9. 【itsdangerous】的加密解密原理(易懂版)

    from itsdangerous import TimedJSONWebSignatureSerializer import time from itsdangerous import Signat ...

  10. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- Direct12优化

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- Direct12优化 第一章:向量代数 1.向量计算的时候,使用XMV ...