闭包、装饰器、元类、实现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)
复制代码

代码须要遵循的就是开放封闭原则,简单来讲,它规定已经实现的功能代码不容许被修改,但能够被扩展。python

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

2. 装饰器

2.1 闭包基础而生的装饰器

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

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中已经实现了很复杂的操做,它是基于元类完成的。
相关文章
相关标签/搜索