python函数式编程之装饰器
1.开放封闭原则
简单来说,就是对扩展开放,对修改封闭。
在面向对象的编程方式中,经常会定义各种函数。一个函数的使用分为定义阶段和使用阶段,一个函数定义完成以后,可能会在很多位置被调用。这意味着如果函数的定义阶段代码被修改,受到影响的地方就会有很多,此时很容易因为一个小地方的修改而影响整套系统的崩溃,所以对于现代程序开发行业来说,一套系统一旦上线,系统的源代码就一定不能够再改动了。然而一套系统上线以后,随着用户数量的不断增加,一定会为一套系统扩展添加新的功能。
此时,又不能修改原有系统的源代码,又要为原有系统开发增加新功能,这就是程序开发行业的开放封闭原则,这时就要用到装饰器了。
2.什么是装饰器
装饰器,顾名思义,就是装饰,修饰别的对象的一种工具。
所以装饰器可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象。
3.装饰器的作用
在不修改被装饰对象的源代码以及调用方式的前提下为被装饰对象添加新功能。
原则:
1.不修改被装饰对象的源代码
2.不修改被装饰对象的调用方式
目标:
为被装饰对象添加新功能。
实例扩展:
import time # 装饰器函数 def wrapper(func): def done(*args,**kwargs): start_time = time.time() func(*args,**kwargs) stop_time = time.time() print('the func run time is %s' % (stop_time - start_time)) return done # 被装饰函数1 @wrapper def test1(): time.sleep(1) print("in the test1") # 被装饰函数2 @wrapper def test2(name): #1.test2===>wrapper(test2) 2.test2(name)==dome(name) time.sleep(2) print("in the test2,the arg is %s"%name) # 调用 test1() test2("Hello World")
不含参数实例:
import time user,passwd = 'admin','admin' def auth(auth_type): print("auth func:",auth_type) def outer_wrapper(func): def wrapper(*args, **kwargs): print("wrapper func args:", *args, **kwargs) if auth_type == "local": username = input("Username:").strip() password = input("Password:").strip() if user == username and passwd == password: print("\033[32;1mUser has passed authentication\033[0m") res = func(*args, **kwargs) # from home print("---after authenticaion ") return res else: exit("\033[31;1mInvalid username or password\033[0m") elif auth_type == "ldap": print("ldap链接") return wrapper return outer_wrapper @auth(auth_type="local") # home = wrapper() def home(): print("welcome to home page") return "from home" @auth(auth_type="ldap") def bbs(): print("welcome to bbs page" print(home()) #wrapper() bbs()
到此这篇关于Python新手学习装饰器的文章就介绍到这了,更多相关Python之装饰器简介内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
本文向大家介绍Python新手学习raise用法,包括了Python新手学习raise用法的使用技巧和注意事项,需要的朋友参考一下 当程序出现错误时,系统会自动引发异常。除此之外,Python 也允许程序自行引发异常,自行引发异常使用 raise 语句来完成。 很多时候,系统是否要引发异常,可能需要根据应用的业务需求来决定,如果程序中的数据、执行与既定的业务需求不符,这就是一种异常。由于与业务需求
问题内容: 我正在尝试学习装饰器。我了解它的概念,现在尝试实现它。 这是我编写 的代码,代码不言自明。它只是检查参数是否传入。 抛出错误的说法。我了解它未在下定义,但不知道如何纠正此代码?我要去哪里错了? 问题答案: 您的装饰器应如下所示: 需要注意的几点: 期望将类作为第一个参数(您可以将其替换为简单的try / except TypeError除外)。 包装器应返回一个函数,而不是被调用函数的
本文向大家介绍js装饰设计模式学习心得,包括了js装饰设计模式学习心得的使用技巧和注意事项,需要的朋友参考一下 装饰设计模式 每种设都有其独特的应用场景和解决问题的方式, 装饰设计模式是动态的为对象添加新的功能, 是一种用于代替继承的技术,无需通过继承增加子类就能扩展对象的新功能。使用对象的关联关系代替继承关系,更加灵活,同时避免类型体系的快速膨胀, 这种模式适合新添加的功能不足以用继承为代价解决
本文向大家介绍新手学习css优先级,包括了新手学习css优先级的使用技巧和注意事项,需要的朋友参考一下 css不是一种程序语言,而是一种描述语言。因此,可以说,css理解起来是非常容易的,大部分人通过简单的学习就可以懂得如何写css代码来定义网页的样式。但是,大部分人同样也会在写css的过程中产生很多困惑,比如为什么自己写的某段css没有生效,或者呈现出的样式和预计的不同,但又不知道要如何解决。
本文向大家介绍Python新手学习函数默认参数设置,包括了Python新手学习函数默认参数设置的使用技巧和注意事项,需要的朋友参考一下 在某些情况下,程序需要在定义函数时为一个或多个形参指定默认值,这样在调用函数时就可以省略为该形参传入参数值,而是直接使用该形参的默认值。 为形参指定默认值的语法格式如下: 形参名 = 默认值 从上面的语法格式可以看出,形参的默认值紧跟在形参之后,中间以英文“=”隔
本文向大家介绍java设计模式学习之装饰模式,包括了java设计模式学习之装饰模式的使用技巧和注意事项,需要的朋友参考一下 装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。 优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。 缺点:多层装饰比较复杂。 实例:给一个人配置穿衣 1:代码结构图