【Python】重要知识点
重要知识点
super() 函数 —— 调用父类方法
8.7 调用父类方法 — python3-cookbook 3.0.0 文档
常见用法
- 用父类(超类)的一个方法
- 在 init() 方法中确保父类被正确的初始化
- 在 init() 方法中确保父类被正确的初始化
多继承中可能出现的错误用法
class Base:
def __init__(self):
print('Base.__init__')
class A(Base):
def __init__(self):
Base.__init__(self) # 单继承没问题
print('A.__init__')
class C(A,B): # 多继承中 __init__两次
def __init__(self):
A.__init__(self)
B.__init__(self)
# 换用super().__init__()
print('C.__init__')
原理 —— Python是如何实现继承的
- 对于定义的每一个类,Python会计算出一个方法解析顺序(MRO)列表。 这个MRO列表就是一个简单的所有基类的线性顺序表。例如:
>>> C.__mro__
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>,
<class '__main__.Base'>, <class 'object'>)
>>>
- 为实现继承,在MRO列表上从左到右开始查找基类,直到找到第一个匹配这个属性的类为止
- MRO列表的构造 —— 合并所有父类的MRO列表并遵循如下三条准则:
- 子类会先于父类被检查
- 多个父类会根据它们在列表中的顺序被检查
- 如果对下一个类存在两个合法的选择,选择第一个父类
进程池和线程池
一篇文章浅析Python自带的线程池和进程池 - 知乎 (zhihu.com)
python线程池 ThreadPoolExecutor 的用法及实战 - 知乎 (zhihu.com)
迭代器和生成器
Python迭代器和生成器详解 - 知乎 (zhihu.com)
总结
- 可迭代对象(Iterable)是实现了__iter__()方法的对象,通过调用iter()方法可以获得一个迭代器(Iterator)。
- 迭代器(Iterator)是实现了__iter__()方法和__next()__方法的对象。
- for...in...的迭代实际是将可迭代对象转换成迭代器,再重复调用next()方法实现的。
- 生成器(Generator)是一个特殊的迭代器,它的实现更简单优雅。
- yield是生成器实现__next__()方法的关键。它作为生成器执行的暂停恢复点,可以对yield表达式进行赋值,也可以将yield表达式的值返回。
- yield就是return返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始。
- next方法和send方法都可以返回下一个元素,区别在于send可以传递参数给yield表达式,这时传递的参数会作为yield表达式的值,而yield的参数是返回给调用者的值。