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

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


# 使用@符号拓展函数功能,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))

你可能感兴趣的:(python,开发语言)