Python中的@函数装饰器到底是什么?
在解释@函数装饰器之前,先说一下,类中的类方法和静态方法。
在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中的@函数装饰器到底是什么?的更多相关文章
- Python中利用函数装饰器实现备忘功能
Python中利用函数装饰器实现备忘功能 这篇文章主要介绍了Python中利用函数装饰器实现备忘功能,同时还降到了利用装饰器来检查函数的递归.确保参数传递的正确,需要的朋友可以参考下 " ...
- python 中多个装饰器的执行顺序
python 中多个装饰器的执行顺序: def wrapper1(f1): print('in wrapper1') def inner1(*args,**kwargs): print('in inn ...
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- python语言中的函数装饰器
装饰器 什么是装饰器? 装饰:给已有的对象(函数)添加新的功能 器:工具 在python中指具备某些功能的函数 装饰器:装饰器就是一个给其他函数增加功能的函数 一种设计原则: ...
- python二 总结--函数-- 装饰器
装饰器是什么? 有什么用? 为什么要用? 真的有用吗? 1.装饰器: 装饰器: 定义:本质是函数,(装饰其他函数)就是为其他函数添加附加功能. 原则:1.不能修改被装饰的函数的源代码 ...
- python中闭包和装饰器的理解(关于python中闭包和装饰器解释最好的文章)
转载:http://python.jobbole.com/81683/ 呵呵!作为一名教python的老师,我发现学生们基本上一开始很难搞定python的装饰器,也许因为装饰器确实很难懂.搞定装饰器需 ...
- python语法基础-函数-装饰器-长期维护
######################################################### # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 ...
- python 修改的函数装饰器
把好的代码记录下来 方便以后学习 修改的函数参数装饰器 from functools import wraps import time import logging def warn(timeout) ...
- python中面向对象之装饰器
python面向对象内置装饰器property,staticmethod,classmethod的使用 @property 装饰器作用及使用 作用:面向对象中的方法伪装成属性 使用如下: class ...
随机推荐
- CSS3 边框 border-image
border-image:xx xx xx 是一系列参数的简写,该属性将图片作为边框修饰 border-image-source:url(border.png); 图片url地址 border-ima ...
- Linux IO 概念(2)【转】
转自:https://www.cnblogs.com/qq289736032/p/9188455.html 在上一篇IO底层的概念中杂合了很多模糊的概念,受知识水平的限制,只是从网上抄了很多过来.从l ...
- 18、Apache服务器
-- web 服务器 survey.netcraft.net --此网站会有每月份的世界上网站使用的WEB服务器的使用率统计 www.apache.org apache a ...
- easy-copy服务器文件拷贝简易小工具
github:easy-copy import os import sys import time import paramiko as pm ''' host格式: { "ip" ...
- Flask请求和应用上下文源码分析
flask的request和session设置方式比较新颖,如果没有这种方式,那么就只能通过参数的传递. flask是如何做的呢? 1:本地线程,保证即使是多个线程,自己的值也是互相隔离 1 im ...
- 流程及迭代驱动测试管理软件, itest 发布到开源中国
itest 源码已发布到码云 ,项目已被开源中国收录!详见 https://www.oschina.net/p/itest-cn 测试人自己开发,汇聚10年沉淀,独创流程驱动测试.度量展现测试人价值 ...
- scanf的返回值
参考这个博客,https://blog.csdn.net/sinat_40936062/article/details/84348021 #include<stdio.h> int mai ...
- vue-cli 3 和 vue-cli 2的区别
分享文章: 浅谈vue-cli 3 和 vue-cli 2的区别 https://blog.csdn.net/weixin_42080056/article/details/81631661 vue- ...
- 非main goroutine的退出及调度循环(15)
本文是<Go语言调度器源代码情景分析>系列的第15篇,也是第二章的第5小节. 上一节我们说过main goroutine退出时会直接执行exit系统调用退出整个进程,而非main goro ...
- Spring(002)-创建rest服务
1.创建基于get参数的rest服务 @RestController @RequestMapping("/action") public class GetController { ...