1.3、Python基础
- 1、闭包
- 2、装饰器-语法糖写法
- 3、Python中的反射
1、闭包
闭包就是外部函数中定义一个内部函数,内部函数引用外部函数中的变量,外部函数的返回值是内部函数
def Student():
name = "susu"
age = 21
print(f"{name}{age}了")
def School():
adress = "河北"
banji = 204
print(name + "在" + adress + "上学")
return School
Student()()
2、装饰器-语法糖写法
能够在不改变原有函数的基础上,在原来的基础上添加额外的功能的代码,就叫做装饰器。
对于装饰器的定义,基于函数闭包的形式来实现,即可以将某一个函数作为参数传递给另一个函数,在这另一个函数中去为函数添加功能。
下面是使用闭包实现装饰器:
import time
def deco(func):
def wrapper():
startTime = time.time()
func()
endTime = time.time()
msecs = (endTime - startTime) * 1000
print("原函数获得的拓展功能,原始函数func_a运行耗时:%d ms" % msecs)
return wrapper
def 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) * 1000
print("原函数获得的拓展功能,原始函数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) * 1000
print("原函数获得的拓展功能,原始函数func_a运行耗时:%d ms" % msecs)
return wrapper
@deco
def func_a(a, b):
print("带有不定参数2个的装饰器演示:")
time.sleep(1)
print("传入的不定参数求和:%d" % (a + b))
@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()
setattr(a, "age", 37)
print(a.age)
ret = getattr(a, "name", "小明")
print(ret)
getattr(a, "get")()
ret = hasattr(a, "name")
print(ret)
print(dir(a))
delattr(a, "name")
print(dir(a))