11 Python装饰器基础
11.4 闭包
11.4.1 闭包概念及其基本使用
11.4.2 闭包中的变量问题-nonlocal
- 1、闭包中使用外部变量
- 2、修改外部函数中的变量
- 小结
11.5 装饰器
11.5.1 装饰器基础
- 学习目标
- 装饰器的应用场景;
- 装饰器函数较之于闭包的明显特点;
- 使用装饰器的语法格式;
- 1、装饰器引入
- 2、装饰器概念
- 例子:
- 小结:装饰器就是在不修改源代码的基础上,给函数增加新的功能;
11.5.2 装饰有参数的函数
- 注意:func( * args, * * kwargs)而不是func(args,kwargs),需要进行参数拆包,
- 错误输出分析;func(args,kwargs)
- 小结
11.5.3装饰的函数有返回值
- 小结
11.6 主从配置
12 Python高级语法专题1
12.1 装饰器(进阶)
12.1.1 在原装饰器上设置外部变量
-
当@test(参数),首先执行test(参数),不执行def函数定义,直接返回function_out,然后就是@function_out,跟之前一样; -
当@function_out没有参数时,就直接返回function_in,然后执行function_in函数,就相当于
- “@function_out” == “login=function_out(login)”
-
可以通过这种方式,向装饰其内部传递参数; -
小结
12.1.2 多重装饰器
- 分析多重装饰器
- @makeItalic在上面,下面还有一个@,这个时候会先暂停,先执行下面的@makeBold装饰器,@makeBold翻译为test3=makeBold(test3);开始执行;
- 小结
12.1.3 类装饰器–使用一个类为函数做装饰
- 就之前是用一个闭包装饰函数
- 分析
- 类中定义__ call __函数,test()会执行call函数;
- @Test,相当于test=Test(test),类中的func就是test,而test接着类()就是一个对象,对象()就调用call函
- 小结
12.3 GIL锁
12.3.1 GIL锁的引入
- 多线程是伪多线程,并没有把cpu资源沾满,因为全局GIL锁,一个时刻只能让一个线程使用cpu;
- 小结
12.3.2 GIL锁概念及影响
- 小结
- 多进程是可以利用多核CPU的,只是多线程不可以,GIL是在多线程中的全局解释锁
12.3.2 GIL解决方案
- 小结–通过胶水c语言,绕过cpython的GIL锁,解决历史遗留问题(单核)
12.4 深浅拷贝
12.4.1 可变与不可变
- 当发现目前分配空间不足储存,是可以拓展(可变),还是需要另找一块地方存储(不可变
- 字典和列表都可以往里追加新内容,是可变类型
- 不可变:数字、字符串、元组
12.4.2 简单可变类型深、浅拷贝
为保证数据的独立性,在开发中,我们希望两个变量值一样,而且互不影响,使用拷贝技术;
python中的copy模块,可以实现拷贝功能;
-
2、浅拷贝
-
3、深拷贝
-
4、作用
- 减少内存使用;
- 数据清洗、修改或者入库的时候,对原数据进行复制一份,以防数据修改之后,找不到原数据;
-
小结
12.4.3 复杂可变类型深、浅拷贝
- 小结
12.4.4 简单不可变类型深、浅拷贝
12.4.5 复杂不可变类型深、浅拷贝
- 小结–深拷贝取决于绿色框的类型,可变就会深拷贝
12.4.4 切片拷贝、字典拷贝
- 1、切片拷贝
- 简单可变是深拷贝
- 2、字典拷贝
- 小结
总结:
1)切片拷贝,本身为浅拷贝,但如果是简单可变,就会开辟新空间,与深拷贝行为一样;
2)字典拷贝,自带的copy,均为浅拷贝;
3)简单可变类型:深,浅拷贝都是深拷贝;
4)复杂可变类型:浅拷贝底层数据不变;深拷贝,会执行深拷贝;
5)简单不可变类型:深、浅拷贝都是浅拷贝;
6)复杂不可变类型:浅拷贝取决于外层不可变,就是浅拷贝,深拷贝取决嵌套类型,嵌套可变就是深拷贝;
13 Python高级语法专题2
13.1 import
13.1.1 import导入模块路径
知道如何导入指定目录下的模块
- 1、import搜索路径
- 2 程序执行时添加新的模块路径
- 小结
13.1.2 reload加载问题
说出reload作用
- 1、重新导入模块
- 尝试再次导入模块,发现依然无法正确获得修改后的模块内容;
- 原因:
- 第一次import模块后,模块被导入到当前文件,第二次再使用import导入同一个模块,第二次导入将不会起作用,这是Python解释器的规则,避免重复导入一个模块带来的其它问题。
- 解法方案;
- 想办法重新加载一次模块
- 小结
13.1.3 from import的私有化问题
- 小结
13.1.4 import和from import的区别
13.2 拆包与继承
13.2.1 拆包
拆包:对于函数中的多个返回数据,去掉元组,列表或者字典,直接获取里面数据的过程;
- *因为传过来的就是,两个复杂数据类型,没有字典做对应的key值,a=100,b=200这种形式,所以需要改为func01(args, * *kwargs);
- 小结
- 可变参数*args, * * kwargs默认会有封包过程;
- 如果想要继续以单数传递到下一个函数,传递的过程必须集上* * *,func( * args, * * kwargs);
13.2.2 单继承中的super()
单继承中super()使用注意
13.2.3 多继承以及MRO顺序
- 1、单独调用父类的方法
- 2、使用super()调用父类方法
- super()调用一次就可以了,会自动执行父类的Init()
- 注意,因为不同的多父类继承,每个父类的Init()参数不一样,就需要*args,和 * * kwargs了
- 使用super()可以避免父类被多次调用初始化,万一是文件被多次打开,造成资源泄露问题;
- 补充题:
- 小结
13.3 property
13.3.1 property基本使用
之前定义类属性,一般会定义另外的类方法用于修改属性,不会直接暴露属性,是通过方法调用,而property就是将这一过程简化一些
property是一个特殊的装饰器,像使用属性一样使用方法
13.3.2 property其他使用方式
- 学习目标
- 知道@xxx.setter的作用;
- 知道@xxx.deleter的作用;
13.3.3 property作为类属性
- 1、类属性方式,创建值为property对象的类属性
BAR=property(get_bar)是创建了一个property对象给BAR
- 小结
13.4 魔法属性与方法
- 学习目标
- 知道__ doc __魔法方法的作用;
- 知道__ module __、 _ _class _ _魔法方法的作用;
- 知道 __ init __魔法方法的作用;
- 知道 __ del __ 魔法方法的作用
- 知道 __ call __魔术方法的作用;
- 知道 __ dict _ _魔术方法的作用;
- 知道 __ str __魔术方法的作用;
- 知道__ getitem __、 _ _setitem _ _、 _ _ delitem _ _ 魔法方法的作用;
__ dict __返回实例属性(init里的)的信息,返回一个字典
类调用就是返回类属性信息,对象调用就返回实例属性,对象信息
- 小结
13.5 with上下文管理器
- 学习目标
- 说出使用with的好处;
- 能够自定义符合with规范的上下文管理类;
14 miniWeb框架
14.1 框架概念
web服务器主要是接收用户浏览器的请求,根据用户的资源请求返回不同的资源;
- 2、重要概念
14.2 minWeb基础框架构建
- 学习目标
- 说出如何实现访问.py和访问.html访问不同的内容
14.3 minWeb框架构建-动态显示
- 学习目标
- 根据客户端不同的动态页面请求,做不同的内容响应
14.4 路由(列表django,装饰器flask)
14.4.1 路由列表(django)
14.4.2 路由装饰器(flask)
-
1、装饰器路由
- 使用装饰器工厂函数接收路径参数,进而实现装饰器路由
-
2、代码实现
- 小结
14.5 选股系统
14.5.1模板替换
14.5.2 股票信息-数据加载1
- 学习目标
- 创建数据库、导入数据
- 使用pymysql模块操作数据库
- 小结
14.5.3 股票信息-数据加载2
14.5.4 个人中心-数据加载
- 小结
|