1.4、Python基础-闭包、装饰器、语法糖、反射

news/2024/10/25 15:22:31/

1.3、Python基础

  • 1、闭包
  • 2、装饰器-语法糖写法
  • 3、Python中的反射

1、闭包

闭包就是外部函数中定义一个内部函数,内部函数引用外部函数中的变量,外部函数的返回值是内部函数
def Student():name = "susu"age = 21print(f"{name}{age}了")def School():adress = "河北"banji = 204print(name + "在" + adress + "上学")return SchoolStudent()()

2、装饰器-语法糖写法

能够在不改变原有函数的基础上,在原来的基础上添加额外的功能的代码,就叫做装饰器。

对于装饰器的定义,基于函数闭包的形式来实现,即可以将某一个函数作为参数传递给另一个函数,在这另一个函数中去为函数添加功能。

下面是使用闭包实现装饰器:
import time# 定义一个装饰函数,函数的参数是一个函数
def deco(func):# 定义一个内部函数,实现具体的功能def wrapper():startTime = time.time()func()endTime = time.time()msecs = (endTime - startTime) * 1000print("原函数获得的拓展功能,原始函数func_a运行耗时:%d ms" % msecs)# 装饰函数的返回值是内部函数的执行结果return wrapperdef func_a():print("hello")time.sleep(1)print("world")if __name__ == '__main__':deco(func_a)()
下面是使用闭包实现装饰器(语法糖的写法):
import time# 定义一个装饰函数,函数的参数是一个函数
def deco(func):# 定义一个内部函数,实现具体的功能def wrapper():startTime = time.time()func()endTime = time.time()msecs = (endTime - startTime) * 1000print("原函数获得的拓展功能,原始函数func_a运行耗时:%d ms" % msecs)# 装饰函数的返回值是内部函数的执行结果return wrapper@deco
def func_a():print("hello")time.sleep(1)print("world")if __name__ == '__main__':func_a()
装饰器,传多个参数的写法:
import time# 定义一个装饰函数,函数的参数是一个函数
def deco(func):# 定义一个内部函数,实现具体的功能,# 原始函数带有不定参数,该处传入不定参数到该内部函数def wrapper(*args, **kwargs):startTime = time.time()func(*args, **kwargs)endTime = time.time()msecs = (endTime - startTime) * 1000print("原函数获得的拓展功能,原始函数func_a运行耗时:%d ms" % msecs)# 装饰函数的返回值是内部函数的执行结果return wrapper# 使用@符号拓展函数功能,func_a就具有了deco函数的功能
# 先传入2个参数
@deco
def func_a(a, b):print("带有不定参数2个的装饰器演示:")time.sleep(1)print("传入的不定参数求和:%d" % (a + b))# 传入3个参数
@deco
def func_b(a, b, c):print("带有不定参数3个的装饰器演示:")time.sleep(1)print("传入的不定参数求和:%d" % (a + b + c))if __name__ == '__main__':func_a(1, 2)func_b(1, 2, 3)

3、Python中的反射

class A(object):def __init__(self):self.name = "sath"def get(self):print("get")a = A()
# 给对象设置个age属性
setattr(a, "age", 37)
print(a.age)# 从对象中反射某个属性或方法, 反射不到的话使用默认值
ret = getattr(a, "name", "小明")
print(ret)#调用get方法
getattr(a, "get")()# 判断对象中是否有某个属性或方法
ret = hasattr(a, "name")
print(ret)# 删除对象的某个属性
print(dir(a))
delattr(a, "name")
print(dir(a))

http://www.ppmy.cn/news/1200003.html

相关文章

创新思维:腾讯产品经理如何解决一头800kg牛的过桥难题?

亲爱的小伙伴们,大家好!我是小米,一个热爱技术、热爱分享的90后,今天我要和大家一起探讨一道经典的面试题——“腾讯产品经理面试题:一头牛重800kg,一座桥承重700kg,牛该怎么过桥?”…

vue3的自定义指令

除了 Vue 内置的一系列指令 (比如 v-model 或 v-show) 之外,Vue 还允许你注册自定义的指令 (CustomDirectives)。 1.自定义指令的目的和简单介绍 自定义指令主要是为了重用涉及普通元素的底层 DOM 访问的逻辑。 一个自定义指令由一个包含类似组件生命周期钩子的对象…

设计模式之装饰模式

一、概念 装饰模式是一种结构型设计模式,允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 二、构造 部件(Component)声明封装器和被封装对象的公用接口。 具体部件(Concrete Component)类是…

全光谱大面积氙光灯太阳光模拟器老化测试

氙灯光源太阳光模拟器广泛应用于光解水产氢、光化学催化、二氧化碳制甲醇、光化学合成、光降解污染物、 水污染处理、生物光照,光学检测、太阳能电池研究、荧光材料测试(透射、反射、吸收) 太阳能电池特性测试,光热转化,光电材料特性测试,生物…

快速跳转插件

只要是著名的编辑软件(很多人使用的)一般就会有相应的跳转插件,用于快速在页面中进行快速的跳转,在Github的这个链接中列出了一些著名软件的跳转插件:https://github.com/acejump/AceJump#comparison

vue如何实现视频全屏切换

最近项目开发中遇到一个视频窗口全屏切换功能&#xff0c;为此在这里做个记录。 具体的实现思路&#xff1a; <template><div class"content-box"><div class"container"><div id"screen" class"screen"><…

Elasticsearch实战:常见错误及详细解决方案

Elasticsearch实战&#xff1a;常见错误及详细解决方案 1.read_only_allow_delete":“true” 当我们在向某个索引添加一条数据的时候&#xff0c;可能&#xff08;极少情况&#xff09;会碰到下面的报错&#xff1a; {"error": {"root_cause": [{&…

R语言环境下使用curl库做的爬虫代码示例

curl库是一个用于传输数据的工具和库&#xff0c;它支持多种协议&#xff0c;包括HTTP、FTP、SMTP等。在爬虫中&#xff0c;curl库可以用来获取网页内容&#xff0c;从而实现爬取网页的功能。通过设置curl的选项&#xff0c;可以实现对网页的请求、响应、重定向等操作。在使用c…