欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 学习day8

程序员文章站 2024-02-24 15:06:22
...
# 装饰器:
# 定义:的、本质是函数,(装饰其他函数)就是为其他函数添加新功能
# 原则:1.不能修改被装饰的函数的源代码
#       2.不能修改被装饰的函数的调用方式
#       即:装饰器对被它装饰的函数是完全透明的。

# 实现装饰器知识储存:
# 1.函数即“变量”
# 2.高阶函数 满足其一:1.把一个函数名当做实参传给另一个函数
#                      2.返回值中包含函数名
# 3.嵌套函数
# 高阶函数+嵌套函数-->装饰器

# 1.
# 变量名只是值的门牌号;同理,函数名是函数体的门牌号,引用方式:函数名()

# 2.
import time
def foo():
    time.sleep(2)
    print("in the foo")

def test1(func):
#  print(func)
   start_time=time.time()
   func()
   stop_time=time.time()
   print("the func run time is%s"%(stop_time-start_time))
test1(foo)   #可以添加新功能,但是改变了调用方式

def test2(func):
    print("in the test2----")
    return func
print(test2(foo))
foo = test2(foo)
foo()   #将之前的函数覆盖,没改变函数的调用方式,但是没有添加新功能
test2(foo)()

#3.
def func1():
    print("in the func1")
    def func2():
        print("in the func2")
    func2()
func1()


def timmer(func):
    def warpper(*args,**kwargs):   #不固定参数,为了适应装饰器装饰各种函数
        flag=False;  #设置标记,记录原本功能是否实现,方便在末尾返回结果
        start_time=time.time()
        res=func(*args,**kwargs)
        flag=True  #标记该函数运行了,设置标记可避免在选择或者循环语句中提前return而无法执行后面操作
        print(func)
        stop_time=time.time()
        print("the func run time is%s"%(stop_time-start_time))
        if(flag):
            return res
    return warpper
@timmer  # 将装饰器加到想加功能的函数之上;@timmer作用相当于test=timmer(test)
def test():
    time.sleep(2)  #等待2秒
    print("in the test*****")

@timmer
def myname(name):
    time.sleep(2)  #等待2秒
    print("myname is"+ name)
    return "myname's return value"

# test=timmer(test)
test() #既没有改变函数调用方式,又添加了新功能
res=myname('刘备')
print(res)

x=0
def grandpa():
    x=1
    def dad():
        x=2
        def son():
            x=3
            print(x)
        son()
    dad()
grandpa() #只打印了一个3
user,passwd='刘备','abc123'
def auth(auth_type):
    print("auth :",auth_type)
    def out_wrapper(func):  #由于装饰器有参数,则装饰的函数地址移到这一层
        def wrapper(*args, **kwargs):
            print("wrapper:",*args,**kwargs)
            if(auth_type=="local"):   #本地验证
                username = input("Username:").strip()
                password = input("Password:").strip()
                flag = False
                if (user == username and passwd == password):
                    print("\033[32;1mUser has passed authentication\033[0m")
                    res = func(*args, **kwargs)
                    flag = True
                else:
                    print("\033[31;1mInvalid username or password\033[0m")
                if (flag):
                    return res
            elif(auth_type=='ldap'):
                print("另一种验证方式~~~")
        return wrapper
    return out_wrapper

def index():
    print("welcome to index page")


@auth(auth_type='local')#装饰器带有参数的时候 home=home
def home():
    print("welcome to home page")
    return "at home"

@auth(auth_type='ldap')
def bbs():
    print("welcome to bbs page")
    return "at bbs"

index()
res=home()
if(res):
    print(res)
print("--------------------")
res=bbs()
if(res):
    print(res)