闭包、装饰器、元类、实现ORM

1. 闭包

什么是闭包

# 定义一个函数
def first(k, b):
    # 再定义一个内部函数,内部函数用到了外部函数的引用
    def second(x):
        print(k * x + b)
    # 这里就是闭包的结果
    return second


f = first(2, 3)
f(1)
f(2)
f(3)
复制代码

代码需要遵循的就是开放封闭原则,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展。

  • 封闭:已实现的功能代码块
  • 开放:对扩展开发

2. 装饰器

2.1 闭包基础而生的装饰器

例:有一个test函数,需要添加功能,但不能改其代码,可以使用装饰器来实现。

def set_func(num):
    def call_func():
        print("添加功能区......")
        num()
    return call_func

@set_func # 此装饰器就等于函数调用test = set_func(test)
def test():
    print("原始代码区......")
# test = set_func(test) # 此功能就等于装饰器 @set_func
test()
复制代码

2.2 装饰器的功能

  1. 引入日志
  2. 函数执行时间统计
  3. 执行函数前预备处理
  4. 执行函数后清理处理
  5. 权限校验等场景
  6. 缓存

2.3 装饰器中的函数

  • 无参的函数:如上述
  • 有参的函数:有什么参数传什么参数
  • 多参及多种参数:用*args和**kwargs接收
  • 有return:加上return,还可用变量接收后再return
  • 一个装饰器可对多个函数进行装饰

最终可演化为:

def set_func(func):
    def call_func(*args, **kwargs):
        print("前校检功能区......")
        func(*args, **kwargs)
        print("后清理功能区......")
    return call_func
    
@set_func
def tset1(*args, **kwargs):
    print("原始代码区......")
    
def tset2(*args, **kwargs):
    print("原始代码区......")
    
test1(*args, **kwargs)
test2(*args, **kwargs)
复制代码
  • 一个函数也可装饰多个装饰器:但先装饰离函数最近的装饰器,运行则运行最外层的装饰器

例:

def set_func1(func):
    print("装饰了1......")
    def call_func(*args, **kwargs):
        print("前校检1区......")
        func(*args, **kwargs)
      
    return call_func
    
def set_func2(func):
    print("装饰了2......")
    def call_func(*args, **kwargs):
        print("前校检2区......")
        func(*args, **kwargs)
     
    return call_func

def set_func3(func):
    print("装饰了3......")
    def call_func(*args, **kwargs):
        print("前校检3区......")
        func(*args, **kwargs)
        
    return call_func
    
@set_func1
@set_func2
@set_func3
def tset(*args, **kwargs):
    print("原始代码区......")
    
test(*args, **kwargs)

# 运行结果
装饰了3......
装饰了2......
装饰了1......
前校检1区......
前校检2区......
前校检3区......
原始代码区......
复制代码

3. 元类

3.1 类也是对象

在python中,类就是一组用来描述如何生成一个对象的代码段,同时,类也是一种对象。

3.2 动态的创建类

因为类也是对象,你可以在运行时动态的创建它们,就像其它任何对象一样,最常见的就是class关键字,还有就是type关键字。

3.3 使用type创建类

type平时用来查看一个对象的类型,而它还有一种完全不同的功能,就是动态的创建类。

  • type可以接受一个类的描述作为参数,然后返回一个类。
  • type(类名,由父类名称组成的元组(针对继承的情况,可以为空),包涵属性的字典[名称和值]),例:
class Test: # 定义了一个Test类
    pass

Test() # 创建了一个Test类的实例对象
# 打印结果:<__main__.Test at 0x10d3f8438>
复制代码

可以手动像这样创建:

type("Test2",(), {}) # 定义了一个Test2类
Test2() # 创建了一个Test2类的实例对象
# 打印结果:<__main__.Test at 0x10d3f8438>
复制代码

当然还可以手动创建带有参数和方法的类

注意:

  • type的第二个参数,元组中是父类的名字,而不是字符串
  • 添加的属性是类属性,并不是实例属性

3.4 元类

元类就是相似于类的父类,其目的就是为了当创建类是能后自动的改变类。

  1. 拦截类的创建
  2. 修改类
  3. 返回修改之后的类

元类就是深度的魔法,99%的用户不必为此操心。

4. ORM

4.1 什么是ORM

ORM是Python编程语言后端web框架Django的核心思想,即对象关系映射,简称ORM。

4.2 说明

  1. 所谓的ORM就是让开发者在操作数据库的时候,能够像操作对象时通过xxx.属性=yyy一样简单,这是开发ORM的初衷
  2. 只不过ORM的事项较为复杂,Django中已经实现了很复杂的操作,它是基于元类完成的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值