Python学习_装饰器 & 反射

装饰器介绍:

#!/usr/bin/env python
# -*- coding:utf-8 -*-


# 装饰器一般用于不修改底层方法的情况下增加功能,例如网站登录,页面跳转的权限管理
def outer(func):
    def inner():
        print("start")
        print("start")
        r = func()
        print("end")
        print("end")
        return r

    return inner


@outer
def f1():
    print("F1")


def f2():
    print("F2")


def f3():
    print("F3")


# 加了@之后
# 1.执行outer函数,并且将其下面的函数名[f1]当作参数
# 2.将outer的返回值重新赋值给 f1, f1 = outer()的返回值inner
ret = f1()
print(ret)


# 小实例分析装饰器
def dec(func):
    # def inner():
    #     print("1111111")
    #     ret = func()
    #     print("2222222")
    #     return ret
    # return inner
    return "guolei"


@dec
def index():
    print("代码代码代码代码")
    return True


print(index)
# 只要函数应用装饰器,那么函数将被重新定义,重新定义为:装饰器的内层函数(返回值)
print(type(index))


# 带参数的装饰器,内层函数也要增加参数,使用动态参数完美解决
# 一个函数可以应用多个装饰器
def outer1(func):
    def inner(*args, **kwargs):
        # print(args)
        # print(kwargs)
        print("123")
        ret = func(*args, **kwargs)
        print("456")
        return ret

    return inner


def outer2(func):
    def inner(*args, **kwargs):
        print("3.5")
        ret = func(*args, **kwargs)
        print("4.5")
        return ret

    return inner


# 多个装饰器, outer1先装饰index, outer2再装饰outer1
# index ==> outer2 里面的inner
# outer2 inner2里面的func == > outer1 里面的inner
# outer2 inner1里面的func == > 原始的index函数
@outer2
@outer1
def index(a1, a2):
    print("非常复杂")
    return a1 + a2


@outer1
def f1(a1):
    print("非常复杂")
    return a1


@outer1
def f2(a1, a2, a3):
    print("非常复杂")
    return a1 + a2 + a3


print(index(1, 5))

 反射介绍:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

# 反射 : 以字符串的形式去对象中操作成员
# getattr() 通过字符串的形式,导入模块,寻找变量、函数等
import commons

target_func = getattr(commons, "NAME", None)
print(target_func)

# hasattr() 判断模块中是否有变量、函数等
# r = hasattr(commons, "name")
# print(r)

# setattr() 在模块中设置变量、函数
setattr(commons, "AGE", 18)
# r = hasattr(commons, "AGE")
# print(r)
print(commons.AGE)

# delattr() 在模块中删除变量、函数
delattr(commons, "AGE")
r = hasattr(commons, "AGE")
print(r)

# 通过反射引入多级目录的模块
# from lib.test import com
r = __import__("lib.test.com",fromlist=True)
print(r)
print(r.f10())

猜你喜欢

转载自www.cnblogs.com/xiaojiulin/p/10572021.html