以下为个人学习笔记整理
# python 内建函数
# build-in function
abs:求绝对值,复数返回大小
all:可迭代对象内是否存在空元素
any:可迭代对象内是否存在非空元素
ascii:转为 ascii 编码
bin:转为二进制
bool:转为 bool 类型
breakpoint:打上断点,通过输入 n 键(Next)进行调试
bytearray:字节数组(可变)
bytearray 和 bytes 不一样的地方在于,bytearray 是可变的。
和字符串一样,字节类型也是不可变序列,而字节数组是可变版本的字节,它们的关系就相当于 list 与 tuple。
由于和字符串一样是序列类型,字节和字节数组可用的方法基本上一致。
bytes:字节数组(不可变)
callable:是否可调用
chr:整数转字符
classmethod:类方法
compile:解析字符串为代码
complex:将字符串或数字转换为复数
delattr:删除属性
dir:返回当前本地范围内的名称列表
divmod:取整除和求余
enumerate:带下标的便利
eval:执行字符串表达式
exec:执行字符串指令
filter:过滤迭代器对象
float:浮点数
format:格式化输出
frozenset:不可变集合
getattr:获取对象属性
globals:全局符号表字典
hasattr:对象是否存在属性
hash:哈希
hex:整数转 16 进制
id:获取唯一 id
input:输入
int:整数
isinstance:判断对象和类关系
issubclass:判断两个类是否是父子关系
iter:迭代函数
len:求长度
list:列表
locals:本地符号表字典
map:对迭代器的对象进行操作
max:求最大
min:求最小
next:迭代器的迭代函数
oct:整数转 8 进制
open:打开文件
ord:字符转整数
pow:求平方
print:打印
property:属性
range:序列类型
repr:打印对象字符串
reversed:倒序
round:四舍五入取整
set:集合
setattr:设置对象属性
slice:切片
sorted:排序
staticmethod:静态类型函数装饰器
str:字符串
sum:求和
super:调用父类方法
def super(cls, inst): | |
mro = inst.__class__.mro() | |
return mro[mro.index(cls) + 1] |
mro 的 C3 超类线性化算法:
算法思想:
- 对象父类的集合
「L(自己)」
可以视作「自己」
+ 每个「L(父类)」
+「父类集合」
- 在存在多个父类合并的情况下,优先提取出第一个集合中的第一个元素与其他集合进行比对,如果其同时出现在其他集合的
非第一的位置
则跳至下一个集合重复上述操作。否则则把该元素添加至父类列表,并从其余所有集合中移除,完成后再次从第一个集合提取第一个元素重复上述内容。
以上图的 Z 为例:
L(O) = [O] | |
L(C) =[C,O] | |
L(A) =[A,O] | |
L(B) =[B,O] | |
L(D) =[D,O] | |
L(E) =[E,O] | |
L(K1) = [K1] | |
+ L(C) | |
+ L(A) | |
+ L(B) | |
+ [C,A,B] | |
L(K1) = [K1] | |
+ [C,O] | |
+ [A,O] | |
+ [B,O] | |
+ [C,A,B] | |
L(K1) = [K1,C,A,B,O] | |
L(K2) = [K2,A,B,D,O] | |
L(K3) = [K3,B,D,E,O] | |
L(Z) = [Z] | |
+L(K1) | |
+ L(K3) | |
+ L(K2) | |
+ [K1,K2,K3] | |
L(Z)= [Z] | |
+ [K1,C,A,B,O] | |
+ [K2,A,B,D,O] | |
+ [K3,B,D,E,O] | |
+ [K1,K2,K3] | |
L(Z) = [Z,K1,K2,K3] | |
+ [C,A,B,O] | |
+ [A,B,D,O] | |
+ [B,D,E,O] | |
L(Z) = [Z,K1,K2,K3,C,A,B,D,E] | |
+ [O] | |
+ [O] | |
+ [O] | |
L(Z) = [Z,K1,K2,K3,C,A,B,D,E,O] |
注意事项: super().func()
调用,不像 类名.func()
的显式,而是带有一些隐式的逻辑。 super().func()
的调用链路取决与 mro
的线性化顺序,会受到继承的父类顺序,以及是否存在多继承等问题而发生变化,并且如果需要调用多个父类的函数,就必须保证父类也支持 super()
操作,否则容易出现调用链中断的情况。
参考链接:传送门
- mro:父类线性化
__mro__
的返回值是一个 tuple,其中包含本身的父类线性关系。包括父类和父类的父类与本身的一个线性化关系。
可以通过 __mro__.index(class)
的方式来确定某个类在线性关系中所处的位置
- bases:父类元组
__bases__
:获取子类对象的上一层父类元组
相关 mro 介绍
tuple:元组
type:获取对象的类型
vars:查看对象内属性
zip:压缩两个可迭代对象为一个
__import__
:和 import 功能类似