Python高级编程--闭包、装饰器

1.闭包:属于高阶函数,在函数内部再定义一个函数,且内部函数用到了外部的变量。

def fun_a(number_a):
    def fun_b(number_b):
        print('内嵌函数的参数是:%s,外部函数的参数:%s'%(number_b,number_a))
        return number_a+number_b
    return fun_b

result = fun_a(10) #result是一个函数
print(result(15))

闭包需要三个条件,缺一不可:

①必须有一个内嵌函数;

②内嵌函数里必须引用一个定义在外部函数里的变量,即内部函数引用外部变量;

③外部函数必须返回内部函数。

2.装饰器

装饰器本质上是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

装饰器常用场景:插入日志、性能测试、事务处理、缓存、权限校验等。

from functools import wraps
import time

def logger(func):
    @wraps(func)
    def write_logging(*args):
        print('[info]--时间是:%s'%time.strftime('%H:%M:%S',time.localtime()))
        func(*args)
    return write_logging

@logger #装饰器
def work(name):
    print('%s在工作'%name)

work('张三')

 3.也可以用类的方法创建装饰器

from functools import wraps
import time

class Logs(object):

    def __init__(self,log_file = 'out.log',level = 'INFO'):
        self.log_file = log_file
        self.level = level

    def __call__(self, func): #定义装饰器,需要有接受函数
        @wraps(func)
        def write_logging(*args):
            log = '[%s]--时间是:%s' %(self.level,time.strftime('%H:%M:%S', time.localtime()))
            print(log)
            func(*args)

        return write_logging

@Logs(log_file='work1.log',level='WARNING') #装饰器
def work(name):
    print('%s在工作'%name)

work('张三')

 4.动态修改类

import types
class Person(object):
    def __init__(self,x_name,x_age):
        self.name = x_name
        self.age = x_age

#类定义好之后,动态的给对象赋予一个新对象属性
p = Person('张三',23)
p.sex = '男' #添加新属性

#给对象添加函数
def fun1(self,work):
    print('%s正在完成的工作:%s'%(self.name,work))

p.fun1 = types.MethodType(fun1,p) #给P对象添加函数
p.fun1('摸鱼')

#给Person类动态添加一个类函数
@classmethod
def class_fun1(cls,work):
    print('类函数的work是:%s'%work)

Person.work = class_fun1
p.work('学Python')

#给Person类添加静态函数
@staticmethod
def static_fun1(work):
    print('静态函数中的work是:%s'%work)

Person.staticFun = static_fun1
p.staticFun('前端')

 也可以使用slots来限制属性:

class Student(object):
    #只允许当前类拥有name和sex属性
    __slots__ = ('name','sex')
    pass

s = Student()
s.name = '张三'
s.sex = '男'
s.age = 23
print(s)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长得丑就要多读书

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值