请指教这个python 装饰器的实现原理是什么?我懵了,函数定义没写参数,竟然可以传参我有点害怕python了。

请看下面这个装饰器和普通函数,参数传递是怎么进行的或者保存在哪里吗?
希望前辈能解释一下,我没理解。

def new_func(func):
    def wrapped(username, passwd):
        if username == 'root' and passwd == '123456789':
            print('通过认证!')
            print('开始执行附加功能')
            return func()
        else:
            print('用户名或密码错误')
            return
    return wrapped

@new_func
def orign():
    print('开始执行函数')

if __name__ == '__main__':
    orign('root', '123456789')
#输出:
#通过认证!
#开始执行附加功能
#开始执行函数
0

1个回答

这很正常。装饰器和被装饰的函数又不是一回事,为啥要参数一样。
python只是在语法层面把装饰模式(设计模式的一种)封装了。这些代码,用Java一样可以实现。
Java的做法:
interface IAction
{
void orign();
}
class MyClass implements IAction
{
public void orign()
{
print("开始执行函数");
}
}
interface IAuthAction
{
void orign(String u, String p);
}
class  Decorator implements IAuthAction
{
private IAction act;
public Decorator(IAction act)
{
this.act = act;
}
public void orign(String u, String p)
{
if (u.equals("root") && p.equals("123456789"))
{
print("通过认证!");
printf("开始执行附加功能");
act();
}
}
}

void main()
{
IAuthAction d = new Decorator(new MyClass());
d.orign("root", "123456789");
}


如果你对比下Java和Python的代码,你就会发现Python节约了什么
首先,在Python里,不需要Iaction和IAuthAction两个接口。这是因为Python是弱类型的。
在Java里,
Object o = new MyClass();
o.orign();
这样不可以,因为编译器不知道o的确切类型,就不能判断o是否有orign这个方法,也没办法生成调用的代码。所以必须将o声明为IAction才行。但是Python是运行时绑定的。
其次,Python内置装饰器,就不需要Decorator类了
Decorator的作用就是,将orign包装成具有两个参数的orign
在Python里,一个函数,如果能返回另一个函数(这两个函数显然参数并不要一样,好比这里的orign),那么就可以直接定义为包装器。
Python会执行包装后的函数,并且传入被包装的函数,相当于Java代码中的
IAuthAction d = new Decorator(new MyClass());

0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
python装饰器详解(四)---把参数传递给装饰器
因为装饰器必须接收一个函数当做参数,所以不可以直接把被装饰函数的参数传递给装饰器.装饰器就是一个普通的函数,回顾def my_decorator(func):    print("I am an ordinary function")    def wrapper():        print("I am function returned by thedecorator")        fu...
[python] 带有参数并且传递参数的装饰器
场景时这样的,我有个一大堆任务,我要给这些任务计时,入库。就需要一个带有参数的装饰器来记录任务名称, 在任务执行前和执行之后都需要记录任务当时执行的时刻。 #-*- encoding=utf-8 -*- from functools import wrapsdef task_logging(taskname): def func_wrapper(func): @wraps(
Python装饰器传参(外部传参)
def get_temp(temp_out): # temp_out外部传参===>"李想" def get_test(test): def get_current_test(temp_in): # temp_in===>"函数传参" data = test() # 调用test()函数===>print("test") ...
python 装饰器传参
你是否方法正确,你的努力总是会带来相对的疲惫,不论是上坡路还是下坡路。没有足够休息的时间,自然就会心力交瘁,特别是不再健康的时候。如果这时还被施加各种各样的压力,你要知道自己如何做出决定才能生活向着内心向往的方向去发展,留下内心认为美好的,同时放弃不必要的负担。
万能装饰器(可任意传参或不传参)
# 万能装饰器def set_fun(func):    def call_fun(*args, **kwargs):        print("添加额外功能")        return func(*args, **kwargs) # 返回原先函数的返回值    return call_fun@set_fundef test(*args, **kwargs):    print(args) ...
python中的装饰器,函数带参数的装饰器,带类参数的装饰器
其实,python 中的装饰器本质上就是一个函数,这个函数接收其他的函数作为参数,并将其以一个全新的修改后的函数替换它 关于装饰器的知识是python面试中比较常见的,对于装饰器的理解可以看这篇文章:理解Python中的装饰器,理解之后,再手写一遍下面的8种装饰器加深理解以后使用就更轻松多了! 1.最简单的函数 def myfunc() print "i am a funct...
Python装饰器:简单装饰,带参数装饰与类装饰器
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式。 第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- '''示例1: 最简单的函数,表示调用了两次''' def myfunc(): print("myfunc() called.") myfunc() myfunc()
python 装饰器@及带参数的情况
一般装饰器:def use_logging(func): def wrapper(*args, **kwargs): if level == 'warn': logging.warn('%s is running' % func.__name__) return func(*args) return wrapper@use_lo
python 装饰器 & 可同时接受有参数与无参数的装饰器
昨天下午仔细学习了装饰器的内容,算是比较明白了。标题的题目来源于这里 from functools import wraps def log(ft): if not isinstance(ft, str): @wraps(ft) def wrapper(*args, **kwargs): print('wrapper') ...
无参装饰器函数和带参装饰器函数
一、无参装饰器函数 Python的 decorator (装饰器) 本质上就是一个高阶函数,它接收一个函数作为参数,然后,返回一个新函数。 使用 decorator 用Python提供的 @ 语法,这样可以避免手动编写 f = decorate(f) 这样的代码。 例1: #!/usr/bin/env python #coding=utf-8 #装饰器函数 def log(f):
简单了解Python装饰器实现原理
                有过开发经验得朋友队装饰模式这个词应该不陌生,装饰装饰,顾名思义就是指对我们原来有得东西进行装饰,比如我们买了新房,那么我们对毛坯房的装修,就是对我们房子进行拓展,让它更加完善!同样得对于代码也是如此,我们就是对我们原有的功能进行功能的拓展!一、假设我们有下面的一个场景1、假设你现在是某个公司的工程师,你当前负责得事情就是公司某个项目整个系统架构基本功能得开发,后续...
python中装饰器的参数与返回值
def itcast1(fun):       def inner(*args, **kwargs):         print("itcast1 start")         # args -> 元组数据()         #kwargs -> 字典数据{}           #result用来接收被装饰函数的返回值         result = fun(*
python里使用带参数的装饰器
在前面一文《python里为什么需要使用装饰器(decorator)》里,我们学习了为什么需要装饰器,知道装饰器就是为了不修改原来函数的代码,又达到增加功能的作用。其实为了装饰器更通用化,那么装饰器是否也可以带参数呢?其实是可以的,这样更加通用化了,达到共享极点。在前面也学习《为什么要使用闭包(closures)》一文,知道参数可以嵌套函数里实现隐藏,并且实现全局参数的功能,与函数一起绑定。因此只
Python 装饰器为什么要双层嵌套
参考链接: python装饰器为什么要双层嵌套函数 python装饰器为什么要双层嵌套 从上述回答中的几个有助于装饰器理解的 关键点: 装饰器发生在 定义 阶段而不是 执行 阶段。 装饰器返回的是一个被装饰过的 函数定义。 结合第二点理解now = foo(now)。 原因: 如果没有嵌套,实际上装饰器返回的要么是原函数的定义,要么根本不是函数,也就是说函数根本没有被装饰。 即使碰巧得到了...
带参数和不带参数装饰器区别
带参数和不带参数装饰器区别
Python装饰器(带参数)
# encoding=utf-8 """带参数的装饰器""" def func(data_param): def func_outer(func_param): def func_inner(*args): if data_param == 'man': print("Type is man") ...
python装饰器,让你对懂python装饰器是怎么回事!!!
首先,什么是装饰器? 比较官方的解释是: 装饰器是用来管理和调用函数和类的一个可调用对象,也就是说分为函数装饰器和类装饰器 这个定义函数我自己通俗化了一点,不然更加看不懂,其实我还有一句更加概括的话,可以解释装饰器: 装饰器就是对被装饰的对象(函数、类)进行重构的,其可以在不改变原来对象的情况下调用对象时执行重构后的行为 这里你可能就糊涂了,看不懂 没关系我们慢慢来!!! 首先,...
python_装饰器二(对有/不定长参数函数的装饰)
上一篇说完了装饰器的原理,现在新的需求来了,我们需要对有/不定长参数的函数进行装饰,那么我们需要怎么对我们的装饰器进行改造呢? 读者你想别着急,如果是你的话,你会怎么做呢? 一:对带参数的函数进行装饰 def func(functionName): def inner(a, b): functionName(a, b) return inner @f
python3之神奇的property装饰器(实现原理)
学习python的同学,慢慢的都会接触到装饰器,装饰器在python里是功能强大的语法。装饰器配合python的魔法方法,能实现很多意想不到的功能。废话不多说,如果你已经掌握了闭包的原理,代码的逻辑还是可以看明白的,咱们直接进入正题。 property的意义 @property把一个类的getter方法变成属性,如果还有setter方法,就在setter方法前面加上@method.setter...
理解Python 返回函数和装饰器
函数也是对象 返回函数 装饰器 理解装饰器 * args是一个数组,代表所有参数,** kwargs是一个字典,代表所有有默认值的关键字参数。比如: def foo(name, age=None, height=None): print("I am %s, age %s, height %s" % (name, age, height)) * args 代表 name类似的参数...
装饰器内部传参的使用
一般在应用装饰器时,装饰器名副其实,就是完全的装饰作用,没有任何实际功用。 但有时为了简化代码,想把一些相同的有功能的代码放在装饰器里,但是装饰器和内部函数间的切面将两者隔离开,因此需要在装饰器和内部函数上做一点小手脚,就可以达到目的: import datetime class ca: def __init__(self): self.value='init
装饰器打印函数时间
# coding: utf-8 import time def timer(func): def wrap(*args, **kwargs): t = time.time() res = func(*args, **kwargs) print(res) print(time.time() - t) re...
理解 Python 装饰器看这一篇就够了
讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切。
python 写一个计算执行时间的装饰器
面试题之一。 写一个装饰器wraps,它接收一个参数t,如果函数执行时间超过1秒,输出“bad”,否则输出“goods”。
为Python定义一个可接受参数的装饰器,并让用户可以修改它的属性
为了让装饰器更加灵活,我们希望编写一个能够接受参数的装饰器,以满足各种需求。     下面以编写一个为函数添加日志功能的装饰器为例,它允许用户修改日志的等级和打印信息: from functools import wraps import logging def logged(level,name=None, message=None): de...
Retry装饰器, 类装饰器
这里说类装饰器,就不得不说一个特殊的函数__call__在Python中,函数其实就是一个对象:>>> f = abs >>> f.__name__ 'abs' >>> f(-123) 123 由于f可以被调用,所以f被称为可调用对象所有的函数都是可调用对象一个类实例也可以变成一个可调用对象,只需要实现一个特殊的方法__call__()我们把P...
python 类装饰器如何接收request参数
我们在django中想要给类加上装饰器,  又想要用到被装饰函数的request参数 怎么办  ~   我这是用来做权限校验的一个装饰器, 以此为例: class UserAuthentication(object):     def __init__(self, func):         self.func = func     def __call__(self, request)...
Python装饰器的通俗理解
在学习Python的过程中,我相信有很多人和我一样,对Python的装饰器一直觉得很困惑,我也是困惑了好久,并通过思考和查阅才能略有领悟,我希望以下的内容会对你有帮助,我也努力通过通俗的方式使得对Python装饰器的理解更加的透彻。在文中如有遗漏和不足,欢迎交流和指点。 允许转载并注明出处:http://blog.csdn.net/u013471155
Python 实例解析,装饰器传参!
# 装饰器传参这个是固定的格式# 三个函数的嵌套,第三层里包含一个闭包,第三层返回闭包的引用(闭包的外层函数引用)# 调用的格式是@set_args()def set_args(args): print(args) def set_fun(func): print(func) print("拒") def call_fun(*args, **kwargs): return...
python:如何批量装饰和取消装饰器函数
flag = False def bool(flag): def wrapper(func): def inner(*args,**kwargs): if flag: print('decoration function start') ret = func(*args,**kwargs...
python装饰器:有参数的装饰器、不定长参数的装饰器、装饰有返回值的函数、通用的装饰器
将一个函数作为另一个函数的参数,返回值赋给这个函数 def func(funcname): print("----fun 1---") def fun_in(): print("----fun_in----1") funcname() print("----fun_in----2") print("----func2-----") return fun_in def test
python装饰器‘@’的原理
在学习装饰器之前必须明白"闭包"def w1(a): #定义函数w1,传入参数a    print('--我是w1--')#打印一行代码而已    def w2( ):#函数里面套函数,也就是闭包        print('---验证---')#执行w2函数,打印一行代码而已        a( )#重点:此时是在函数w2函数里面,执行a( )即第一行传入a就执行a函数,传什么就执行什么函数  ...
Python 装饰器实例:调用参数合法性检查
# -*- coding: UTF-8 -*- ''' @summary:验证器 该模块提供了一个装饰器用于验证参数是否合法。使用方法为: from validator import validParam,nullOk,multiType @validParam(i=int) def foo(i):     return i+1   编写验
python装饰器,自己实现一个简单的装饰器
python 装饰器
实验吧 这个FLAG有点怪 By Assassin
首先感慨一下,感觉自己还是太菜了,这个是2014sctf的RE200,实际是400分的安卓题目,现在做出来其实也是在大佬的提示下完成的,怎么说只能说是分析调出来了,并不算是自己做的,本题过程也很复杂(真心膜拜比赛期间可以做出来的大牛了)下面进入正题,我尽可能讲的清楚一些,在此期间也会借鉴一下大佬的东西 首先肯定是安卓模拟器看一看软件到底是干啥的,大概就是输入一个东西,返回一个值。然后我们将安卓ap
Python函数中函数定义、调用、传参、变量
1、定义函数的规则 我们自定义函数时,需要满足一些规则,否则编译器不会识别。  (1)函数代码块以def关键词开头,后接函数标识符名和圆括号()。  (2)任何传入实参和形参必须放在圆括号中。圆括号中写的是形参。  (3)函数的第一行语句可以选择性地使用文档字符串—-用于存放函数说明。  (4)函数内容以冒号起始,并且函数体要有缩进。  (5)return[expression]结束函数,选择性...
python版 异常重试的次数,间隔的装饰器涵数
from functools import wraps from threading import Event def retry_exception(retry_count=0, interval_wait=0): def wrap(f): @wraps(f) def func(*args, **kwargs): ...
python---ddt语法--动态参数的回顾
__author__ = 'Administrator'#动态参数的回顾# def print_msg(*args):#     print(args)## print_msg(1,2,3,4)#元祖## print_msg(*[1,2,3,4])#元祖# print_msg(*[[1,2],[3,4]])#元祖## print_msg(*{'age':19,"name":'五月'})#元祖--获...
也谈python装饰器为什么需要两层嵌套?
文章包括以下内容:1,装饰器的语法结构和运行顺序是怎样的?2,为什么需要两层装饰器?单层的装饰器为什么会报错?  'NoneType' object is not callable .经修改不报错的单层装饰器为什么也不推荐使用?3,python语言的设计者为啥要把他设计为双层?最近在学习装饰器,过程中遇到许多困难,现在大体解决了,现在将一些经验分享给大家.由于是初学,可能存在错误,烦请指出讨论.1...
python-静态成员函数和classmethod装饰器
1. python类中定义的变量,如果不加self就不归属于类,只有在第一次实例化时进行初始化 class Count1: count = 0 def __init__(self): Count1.count +=1 self.num = 1 # count += 1 不允许 def get_count(self):...
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 我想学python 我想学习python

相似问题

2
请指教这个python 装饰器的实现原理是什么?我懵了,函数定义没写参数,竟然可以传参我有点害怕python了。
0
求教:python paramiko库:paramiko.ssh_exception.SSHException: not a valid RSA private key file
0
tensorflow环境下只要import keras 就会出现python已停止运行?
1
python re正则表达式,怎么匹配一段字符中间 的部分,已知头尾
0
python selenium模块安装Chromedriver的问题
0
re模块sub方法的参数:rep1,此时传入函数,为什么直接传入函数名就可以了?
2
Python解决嵌套for循环性能慢
0
python如何用一个程序向另一个程序发送数据
0
python画图的几段代码疑问求解
0
python输出显示一部分正常一部分乱码
1
【python】用python读取txt并按规则写入excle
1
初学者,python虚拟环境下安装了flask_script,但运行的时候提示没有该模块,怎么解决?
1
python读取txt中的数据,之后对其进行曼哈顿距离计算,但是中间遇到了数据格式错误等问题
2
为什么我的神经网络的COST一直起伏,不是持续往0收敛?
2
python 动态页面爬虫代码
1
python re正则表达式,怎么匹配一段字符中间 的部分,已知头尾
1
爬虫无法运行,请大神帮忙看下
2
python 里 提示get()方法 缺少了一个参数, 可是get()方法是系统自带的啊,不需要参数啊,求解啊,大神
1
Python, TypeError: APP() takes no arguments
1
这段代码有点疑问 两个return 的值是什么情况