Python基础09-闭包与装饰器

装饰器

        装饰器,字面意思就是装饰

        编程里面的装饰:比如有个函数,是登录的函数 ,在登录函数中增加其他功能

装饰器定义:

        是给已有的函数增加额外的功能,本质是一个闭包函数

闭包函数:

        变量函数销毁之后,有时候需要这个函数的变量 闭包解决这个问题

闭包的定义:

        在函数嵌套的前提下,内部函数使用外部函数的变量,并且外部函数返回内部函数

我们把这个使用外部函数变量的内部函数称为闭包

闭包形成条件:

        1.实现函数嵌套

        2.内部函数使用外部函数的变量

        3.外部函数返回内部函数名字

简单的闭包

# 外部函数
def test1():
    b=10
# 内部函数
def test2():
    print(b)
    return test2

a=test1()
a()

函数怎么去执行

        从上到下开始走,走到调用函数的时候才运行,调用test1(),开始运行test1()函数

test1函数,不会运行test2,原因是test2没有被调用,返回test2,给到test1,a接受变成test2        

拿到函数的变量,在另外一个函数计算

def test1(num1):
    def test2(num2):
        result=num1+num2
        print(result)
    return test2

# a相当于test2
a=test1(2)
a(3)

        函数调用 函数名()

        装饰器 @方法名

给已有的函数增加额外的功能

例如:发表文章,需要先登录才可以进行发表

闭包流程

检查有没有登录 comment

def check(fc):
    print('检查登录')
    def inner():
        print('登录')
        fc()
    return inner
    
# 发表评论
def comment():
    print('发表评论')

c=check(comment)
c()

从上到下开始走,走到check(comment)开始执行函数 ,fc是comment

print 检查 走到inner 不会被执行,走到return这里 返回一个inner

inner被谁接受?check接受 check(comment)赋值给 c 所以c就是 inner

inner()就变成了一个调用函数 走到inner函数中 打印 登录 fc()

fc是comment 相当于 comment()

总结:给已有的函数增加额外的功能 不修改已有的函数的源代码

@方法名

def check(fc):
    print('检查登录')
    def inner():
        print('登录')
        fc()
        return inner

# @check 相当于 check(comment)  代理的意思
@check
def comment():
    print('发表评论')

comment()

@check 相当于 check(comment) check(fc)相当于 check(comment)

inner不执行 返回inner 返回inner给到谁 给到comment()函数 comment相当于是inner

inner() 走到登录 fc是什么 comment 发表评论

练习题目:现在有个函数,想要知道这个函数执行了多久 用装饰

import time
def decorate(fc):
    def inner():
        # 获得了当前的时间
        print(time.strftime('%Y-%m-%d %H:%M:%S'))
        t_start=time.time()
        a=fc()
        print(a)
        # 获得了当前的时间
        t_end=time.time()
        print(time.strftime('%Y-%m-%d %H:%M:%S'))
        print('总共花了多久的时间%.2f'%(t_end-t_start))
        # inner函数没有return  没有return  就是NOne
        return 2
    return inner

# 小弟相当于  decorate(test_un)
@decorate
def test_un():
    time.sleep(1)
    print('test_un在执行中')
    return 8

# test_un()相当于 inner
print(test_un())

另一种写法

import time
def decorate(fc):
    def inner(a,b,c):
        # 获得了当前的时间
        print(time.strftime('%Y-%m-%d %H:%M:%S'))
        t_start=time.time()
        a=fc(a,b,c)
        print(a)
        # 获得了当前的时间
        t_end=time.time()
        print(time.strftime('%Y-%m-%d %H:%M:%S'))
        print('总共花了多久的时间%.2f'%(t_end-t_start))
        # inner函数没有return  没有return  就是NOne
        return 2
    return inner
# 小弟相当于  decorate(test_un)
@decorate
def test_run(a,b,c):
    time.sleep(1)
    print('test_un在执行中')
    return a+b+c
    
# test_un()相当于 inner
print(test_run(1,2,3))

类方法和静态方法这个实例方法 object在python3 object上个顶级的父类

class Foo(object):
    def instance_method(self):
        print('实例方法')

    @staticmethod
    def static_method():
        print('静态方法')

    @classmethod
    def class_method(cls):
        print('类方法')

调用方式,实例方法就是对象方法 对象 类()

foo=Foo()
foo.instance_method()
foo.class_method()
foo.static_method()

静态方法和类方法还有实例方法都是可以通过对象去调用的

类进行调用

Foo.static_method()
Foo.class_method()
Foo.instance_method('aa')

静态方法和类方法都是可以通过类去调用

静态方法 静态方法中没有和类相关的东西 没有self class

独立的空间 公共的区域 都可以用 大家都可以去使用

class TimeTest(object):
    def __init__(self,hour,minute,second):
        self.hour=hour
        self.minute=minute
        self.second=second

    @staticmethod
    def showTime():
        return time.strftime('%H:%M:%S',time.localtime())

print(TimeTest.showTime())

类方法

class Tool:
    count=0

    def __init__(self,name):
        self.name=name
        Tool.count+=1

    @classmethod
    def show_tool_count(cls):
        print('工具对象的总数%d'%cls.count)

tool1=Tool('锄头')
tool2=Tool('斧头')
tool3=Tool('棒槌')
Tool.show_tool_count()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值