python闭包,定义简单学会

本文介绍了Python中的闭包概念,包括其定义和特征,通过示例展示了如何创建闭包来实现特定功能。接着讨论了装饰器的使用,演示了一个用于计算函数运行时间的装饰器实现。最后,探讨了Python类的细节,包括_命名的私有属性、类方法、静态方法以及委托属性的使用。
摘要由CSDN通过智能技术生成

1.什么是闭包?

闭包就是能够读取其他函数内部变量的函数,在本质上,闭包是将函数内部和函数外部连接起来的桥梁。只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数”。

闭包包含自由(未绑定到特定对象)变量,这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包”一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)

闭包的特征?

1.嵌套函数
2.内层函数引用外层函数的变量(自由变量:nonlocal)
3.外层函数返回的是内层函数


定义闭包,完成的功能为:传入一个数求和并输出
例如:

传入10 ->输出10
传入15 ->输出25
传入20 ->输出45

def outer_summary():
    sum = 0
    def summary(num):
        nonlocal sum
        sum = sum + num
        print(sum)
    return summary
summary = outer_summary()
summary(10)
summary(15)
summary(20)
 

10
25
45
 


2.定义一个装饰器:打印函数运行花费的时间


你在执行之前获取一个时间
执行函数
在执行函数之后获取一个时间
去求时间差

import time


def outing(func):
   def inner(*args, **kwargs):
      time_da = time.time()
      print(time_da)
      func(*args, **kwargs)
      time_da1 = time.time()
      print(time_da1)
      print("{}函数运行时间为:{:.9f}秒".format(func.__name__, time_da1 - time_da))

   return inner


@outing
def time_c(*args, **kwargs):
   time.sleep(2)
   print('运行结束')


time_c()




1657971612.9682002
运行结束
1657971614.9791825
time_c函数运行时间为:2.010982275秒



3.定义一个类:


要求:包含一个对象属性,且用_(单下划线)命名的
定义一个类方法(装饰器)
定义一个静态方法(装饰器)
定义委托属性(三个类装饰器): 可以访问_命名的属性的值
可以修改_命名的属性的值
可以删除_命名的属性
执行:
实例一个对象
调用类方法(类和对象两种方式)
调用静态方法(类和对象两种方式)
对象.委托属性
对象.委托属性 = value
del 对象.委托属性

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self._data = 5
 
    def get_info(self):
 
        return self.name + str(self.age)
 
    def get_data(self):
        return self._data
 
 
    def set_data(self, value):
        self._data = value
 
    def del_data(self):
        del self._data
    data = property(get_data, set_data, del_data, "data is managed attribute of _data")
 
    @staticmethod                       
    def print_info():
        print("INFO")
 
    def test_func(self):
        print(self.name)
 
    # print_info()
    @classmethod                         
    def class_method(cls):
        print(cls)
per = Person('zhangsan', 18)
Person.print_info()           
per.test_func()              
Person.class_method()         
per.class_method()        
print(per.data)                   
per.data = 666              
print(per.data)
del per.data
 

INFO
zhangsan
<class '__main__.Person'>
<class '__main__.Person'>
5
666
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值