python高级编程和异步io并发编程
第一章
- 导学
- python进阶方法
- 阅读(库和框架)源码
- 优化代码
- 目标:python高级和并发编程
- 方法:功能---原理---应用案例
- 课程安排:元类、多线程、多进程、异步IO、asyncio---重要
- python进阶方法
- 开发环境配置
第二章(一切皆对象)
-
python中一切皆对象
-
动态语言和静态语言的区别
- python面向对象更加彻底
-
函数、类(模板对象)都是对象,属于python的一等公民
- 可以赋值给一个变量
- 可以添加到集合对象中
- 可以作为参数传递给函数
- 可以当做函数的返回值(装饰器)
-
-
type、object和class之间的关系
-
通过它们理解python中一切皆对象
-
一切都是继承自object
-
可以通过tpye()生成类对象
-
type--int--1即:type--class(int、str等)--obj
-
# 查看一个类的基类 类.__bases__
-
-
object是最顶层的基类,它没有基类
-
type本身是一个类,同时也是一个对象
-
-
python中的内置对象类型
- 对象的三个特征:
- 身份---id,可以理解为内存中的指针,查看ID----id(obj)
- 类型,python中不用指定类型
- 值---value,1使用int类型封装,使用a变量指向1对象
- None对象(全局只有一个)
- 数值: int/float
- 迭代类型
- 序列类型:list、range、tuple、str、array(数组)
- 映射类型:dict
- 集合:set(效率高)、forzenset
- 上下文管理类型:with语句
- 其他:模块类型、class和实例、函数类型、方法类型、代码类型、object类型、type类型、ellipsis类型、notimplemented类型
- 对象的三个特征:
-
小结
- python过于灵活,没有静态语言的编译过程,不够严谨。
- 可以串联python知识点。
第三章(魔法函数)
-
什么事魔法函数
-
# 定义此魔法函数,对象就变成可迭代对象 __getitem__(self,item)
-
-
python中的数据模型,以及数据模型对python的影响
- 魔法方法的调用时隐式的,会自己调用,不用主动调用
- len(obj),会首先调用类中的
__len__
,如果没有定义,就是调用__getitem__
-
python魔法函数(贯穿于整个python学习)
-
非数学运算
-
# print(对象)会调用__str__ # 直接调用对象时,会调用__repr__
-
-
jupyter简单的打开方法:
pip3 install -i https://pypi.douban.com/simple notebook ipython notebook
-
-
len函数的特殊性
- 如果统计list、set、dict等内置类型,速度会非常快,这些类型是c语言写出来的,不会去遍历,会直接读取长度。
-
小结
- 认识魔法函数、名称都是固定的,隐式调用
第四章(深入对象和类)
-
鸭子类型和多态
- 所有的类或对象都实现了一个共同的方法,方法名要一样,这些类可以归为同一种类型,这样就可以同时调用这些类的方法。
- extend(),接受的是可迭代类型,只要可迭代就行。
-
抽象基类
- 抽象基类不能实例化
- 不建议使用抽象基类,建议使用 isinstance
-
isinstance和type的区别
- type 无法找出继承关系
-
类变量和对象变量
- 类变量和对象变量是独立的
-
类属性和实例属性以及查找顺序
-
由下而上
-
属性查找顺序按照C3算法
-
如何查看属性查找顺序
# 查看查找顺序 print(A.__mro__)
-
-
静态方法、类方法、对象方法以及参数
- 使用最多的就是静态方法
- 静态方法,可以预处理传入的数据,可以在其中创建实例对象,并返回。缺点:更改类名时需要更改静态方法返回对象
- 类方法,可以预处理传入的数据,优势:不用担心类名更改。
-
数据封装和私有属性
-
实例的私有属性不允许外部访问,允许实例方法访问
-
非要访问:实例对象.类名__私有属性
print(user._User__birthday)
-
-
python对象的自省机制
-
自省是通过一定的机制查询到对象的内部结构
# 通过__dict__查询属性,返回的是字典,如果没有就报错 print(user.__dict__) # 赋值 user.__dict__['name']='tom' # 通过dir()查看对象的属性,返回键的列表,没有值
-
-
super函数
- super执行顺序不是调用父类,而是按MRO算法调用
print(obj.__mro__)
可以查看obj对象的父类调用顺序。两种可能:广度优先,深度优先。