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 装饰器的功能
- 引入日志
- 函数执行时间统计
- 执行函数前预备处理
- 执行函数后清理处理
- 权限校验等场景
- 缓存
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 元类
元类就是相似于类的父类,其目的就是为了当创建类是能后自动的改变类。
- 拦截类的创建
- 修改类
- 返回修改之后的类
元类就是深度的魔法,99%的用户不必为此操心。
4. ORM
4.1 什么是ORM
ORM是Python编程语言后端web框架Django的核心思想,即对象关系映射,简称ORM。
4.2 说明
- 所谓的ORM就是让开发者在操作数据库的时候,能够像操作对象时通过xxx.属性=yyy一样简单,这是开发ORM的初衷
- 只不过ORM的事项较为复杂,Django中已经实现了很复杂的操作,它是基于元类完成的。