装饰器

  简介

  功能与格式

  内置装饰器

    @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. Win7。56个进程让我头疼

    乱七八糟的进程一个一个往外蹦,如此痛苦. 安装了一个VM9,进程数量+5,安装了卖咖啡的,进程数量+5. 除去这10个,系统进程数量还有46个....还是太多... 64位系统,真的很痛苦,还没有怎么 ...

  2. 2019.9.21 csp-s模拟测试49 反思总结

    没赶上昨天的考试,不过我这种人考不考都没有多少提升吧. 挺服气的一场考试,有生以来参加的最让人想笑的考试. T1:养花 取模,区间询问最大值,有点套路化的预处理答案…难点也在预处理上.容易想到分块然后 ...

  3. HDU3887 Counting Offspring [2017年6月计划 树上问题03]

    Counting Offspring Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  4. 2019阿里云开年Hi购季云通信分会场全攻略!

    2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...

  5. Django项目:CRM(客户关系管理系统)--14--06PerfectCRM实现King_admin注册功能获取内存优化处理

    <th >{% get_app_name admin_class.model %}{{ admin_class }} </th> #kingadmin_tags.py # —— ...

  6. web前端学习(四)JavaScript学习笔记部分(3)-- JavaScript函数+异常处理+事件处理

    1.Javascript函数-了解函数的用途 1.1.函数: 函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块 2.Javascript函数-定义函数 2.1.function必须小写 3. ...

  7. jquery 设置 html标签响应式布局

    function sWidth() {//计算当前设备宽度 var widthSize; if ($(window).width() <= 640) { widthSize = $(window ...

  8. spring boot 异常处理(转)

    spring boot在异常的处理中,默认实现了一个EmbeddedServletContainerCustomizer并定义了一个错误页面到"/error"中,在ErrorMvc ...

  9. php安装oci8和pdo_oci扩展实现连接oracle数据库

    PHP一般跟MySQL数据库搭配使用,但最近遇到一个需求需要实现PHP连接Oracle,了解到PHP可以通过pdo_oci和oci8扩展来连接Oracle,这里将安装的过程记录下来. 安装环境:PHP ...

  10. Python数据分析与展示[第一周]

    ipython 中的问号 获得相关的描述信息 %run 系统文件 执行某一个文件 ipython的模式命令 %magic 显示所有的魔术命令 %hist    命令历史输入信息 %pdb    异常发 ...