在解释@函数装饰器之前,先说一下,类中的类方法和静态方法。

在Python中完全支持定义类方法、静态方法。这两种方法很相似,Python它们都使用类来调用(ps:用对象调用也可以)。

区别在于:Python会自动绑定类方法的第一个参数,类方法的第一个参数会自动绑定到类本身;但对于静态方法则不会自动绑定。

类方法用@classmethod修饰,静态方法用@staticmethod修饰,如下:

 #coding=utf-8
class Person:
@classmethod
def eat(cls):
print("类方法eat:",cls) @staticmethod
def sleep(p):
print("静态方法sleep:",p) Person.eat()
Person.sleep("info") p = Person() p.eat()
p.sleep('info')

控制台打印如下:

解释:eat方法因为是@classmethod修饰所以它是类方法,所以第12行调用时,不用传入任何参数,即可以调用,因为它会自动绑定类本身到第一个参数。

sleep方法因为是@staticmethod修饰所以它是静态方法,所以在第13行调用时,需要传入参数。再看17、18行,可以得出结论:不管是用类或者对象调用静态方法,Python都不会对静态方法的第一个参数进行自动绑定。

  上面的@classmethod 和 @staticmethod 其实就是函数装饰器,其中classmethod和staticmethod为Python中内置的函数。

  使用@符号引用已有函数后,可用于修饰其他函数。

例如@函数A 装饰 函数B ,实际完成的步骤为:

1.将被装饰的函数B作为参数传给函数A

2.将函数B替换为第1步的返回值。

举个例子:

 def funA(fn):
"""参数为一个函数对象"""
print('A')
fn() #执行传入的fn函数
return 'tizer' '''
下面的代码相当于funA(funB)
funB将会被替换为该语句的返回值
由于funA返回tizer,因此funB就是tizer
'''
@funA
def funB():
print('B')
print(funB)

先看运行结果:

解释:既然funB作为参数传给了funA,那就是得先执行funA中的代码,所以执行了print(‘A’),打印了A,然后执行第4行fn(),因为传入的funB,funB中的代码为print('B'),所以打印了B,然后funA 返回了一个字符串tizer,所以funB 等同于 tizer,第15行print(funB) 等同于 print('tizer'),所以打印了tizer。

  

Python中的@函数装饰器到底是什么?的更多相关文章

  1. Python中利用函数装饰器实现备忘功能

    Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下   " ...

  2. python 中多个装饰器的执行顺序

    python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...

  3. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  4. python语言中的函数装饰器

    装饰器 什么是装饰器? 装饰:给已有的对象(函数)添加新的功能 器:工具              在python中指具备某些功能的函数 装饰器:装饰器就是一个给其他函数增加功能的函数 一种设计原则: ...

  5. python二 总结--函数-- 装饰器

    装饰器是什么? 有什么用? 为什么要用? 真的有用吗? 1.装饰器: 装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能. 原则:1.不能修改被装饰的函数的源代码          ...

  6. python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)

    转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需 ...

  7. python语法基础-函数-装饰器-长期维护

    ######################################################### # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 ...

  8. python 修改的函数装饰器

    把好的代码记录下来 方便以后学习 修改的函数参数装饰器 from functools import wraps import time import logging def warn(timeout) ...

  9. python中面向对象之装饰器

    python面向对象内置装饰器property,staticmethod,classmethod的使用 @property 装饰器作用及使用 作用:面向对象中的方法伪装成属性 使用如下: class ...

随机推荐

  1. vue 开发系列(十) VUE 作用域插槽

    使用场景 官方解释,有时让插槽内容能够访问子组件中才有的数据是很有用的.比如我们在使用ant-design-vue 的表格控件时. <a-table-column title="注释& ...

  2. 常用linux系统监视软件

    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo ##epel源 yum install -y ...

  3. windows10下Bad owner or permissions on .ssh/config的解决办法

    方法很简单,亲测有效. 1.进入如下路径C:\Users\用户名\.ssh,你会看到有config这个文件 2.右击config,属性→安全→高级→禁止继承→删除所有继承(忘了全称了,大概这个意思)→ ...

  4. flask 上下文

    上文:找到被创建成字典形式的东西 下文: 找到request并执行

  5. XSS-Stored

    存储型XSS (持久性XSS) 将恶意JavaScript代码存储在数据库,当下次用户浏览的时候执行 Low <?php if( isset( $_POST[ 'btnSign' ] ) ) { ...

  6. zz2017-2018年AI技术前沿进展与趋势

    2017年AI技术前沿进展与趋势 人工智能最近三年发展得如火如荼,学术界.工业界.投资界各方一起发力,硬件.算法与数据共同发展,不仅仅是大型互联网公司,包括大量创业公司以及传统行业的公司都开始涉足人工 ...

  7. idea中怎么忽略(ignore)掉 .idea等文件

    idea需要下载一个专门的plugins 来ignore .idea *.iml等文件 可以在https://plugins.jetbrains.com/idea/plugin/7495–ignore ...

  8. Zabbix的基本功能

    zabbix组件: 两核心组件: zabbix-server(监控者) :收集agent发送的数据,写入数据库(mysql.oracal.)中,再通过web展示出来.默认端口为10051. zabbi ...

  9. [LeetCode] 209. Minimum Size Subarray Sum 最短子数组之和

    Given an array of n positive integers and a positive integer s, find the minimal length of a contigu ...

  10. java web开发入门十一(idea maven mybatis自动代码生成)基于intellig idea

    6.idea maven mybatis逆向工程(代码生成器) 1.配置pom.xml 在plugins标签下添加mybatis-generator-maven-plugin <plugin&g ...