Python中常见的特殊方法
最前:磨磨蹭蹭总结了快半个月,内容比较多。整理不易,如果觉得有用的麻烦点个推荐
- 跟运算符无关的特殊方法
-
字符串/字节序列
-
repr:
在使用 repr(对象) 输出对象信息时直接调用,或者使用 print(对象) 输出对象信息以及使用 str(对象) 转换对象格式,并且当对象没有定义 str 方法时间接调用
返回值为字符串格式的文字描述
一般用于为开发者提供对该对象的基本情况说明,输出内容包括该对象的类名以及各属性的值,可适当说明父类等其他描述
-
str:
在使用 print(对象) 输出对象信息以及使用工厂函数 str(对象) 转换对象格式时调用,而当对象所属的类内没有自定义 str 方法时,会调用类内的 repr 方法
返回值为字符串格式的文字描述
一般用于在为用户描述对象时提供可读性更强的文本输出,如下代码:
from datetime import datetime today = datetime.now() print(repr(today)) # 'datetime.datetime(2020, 1, 1, 14, 00, 00, 000000)' print(str(today)) # '2020-01-01 14:00:00.000000'
对比可以看出使用 repr(对象) 更能清楚表示该对象的情况,是为开发者准备的;而使用 str(对象) 的可读性更强,是为使用者准备的
-
format:
在使用 '{}'.format(对象) 或 format(对象) 时调用,一般用于自定义对象的格式化输出格式
可以往 format 方法传一个参数表示将要被填充的字符串,之后在代码底层会调用对象的 str 方法和 repr 方法将对象转化成字符串格式,再将对象的字符串填充到被填充的字符串中,返回值为填充完成的字符串
当被填充的字符串为空字符串时,也可以理解成返回 str(对象)
如下代码:
import sys class MyClass: def __init__(self, name): self.name = name def __repr__(self): print(sys._getframe().f_code.co_name) return '名字: %s' % self.name def __str__(self): print(sys._getframe().f_code.co_name) return super().__str__() def __format__(self, format_spec): print(sys._getframe().f_code.co_name) return super().__format__(format_spec) s = MyClass('s') print('{}'.format(s)) print('*' * 20) print(format(s)) # 输出结果: # __format__ # __str__ # __repr__ # 名字: s # ******************** # __format__ # __str__ # __repr__ # 名字: s
拓展:sys._getframe().f_code.co_name 用于在函数内输出该函数的函数名
-
bytes:在 bytes(对象) 时调用,一般用于返回bytes格式的对象描述
-
-
数值转换
-
abs:在 abs(对象) 时调用,一般用于返回对象某项属性的绝对值
-
bool:在 bool(对象) 时调用,一般用于返回对象某项属性的布尔值
-
complex:在 complex(对象) 时调用,一般用于返回对象某项属性的复数格式
-
int:在 int(对象) 时调用,一般用于返回对象某项属性的整型格式
-
float:在 float(对象) 时调用,一般用于返回对象某项属性的浮点型格式
-
hash:
对象可哈希:若一个对象在其生命周期内保存不变,而且能与其他对象相比较,那么这个对象是可哈希的
在hash(对象)、将对象添加进集合或将对象作为字典的键等场景都会调用,返回由哈希算法计算出的该对象的哈希值
-
-
集合模拟
-
len:在 len(对象) 时调用,一般用于返回对象某个属性的长度
-
getitem:
使用 对象[item] 取索引值或是 对象[start: end: step] 切片取值时调用
该方法需要传进一个参数作为取值依据,当[]内只有一个值时,传进方法的参数是[]内的值,当[]内是使用:隔开的多个值,并且值的总数量不超过3个时,传进的参数是一个slice对象,使用:隔开的值分别对应slice对象的start、end、step,再使用slice对象进行切片操作
需要返回取值结果
拓展:
- 在使用 iter(对象) 希望能获取一个迭代器对象,同时对象没有实现 iter 时,解释器会使用 getitem 创建一个迭代器,并尝试按顺序(从索引0开始)获取元素
- 如果对象 iter 和 getitem 都没有实现时,使用 iter(对象) 语句则会抛出 TypeError 异常
-
setitem:
使用 对象[item] 对指定索引值赋值或是 对象[start: end: step] 切片赋值时调用
该方法第一个参数如 getitem ,第二个参数为使用赋值号连接的值,一般使用该值替换掉取值范围的值
不需要返回值
-
delitem:
使用 del 对象[item] 删除指定索引值值或是 del 对象[start: end: step] 切片删除时调用
具体使用方法如 getitem
可以没有返回值
-
contains:在 item in 对象 时调用,一般用于判断item是否在对象的某个属性值中,需要返回布尔类型的结果
-
-
迭代枚举
-
iter:
用于需要使用对象生成一个迭代器对象时调用,如:iter(对象)、使用 for语句 遍历对象、*对象 等
拓展:
-
使用 collection.abc 里的 Iterable 和 Iterator 配合 isinstance函数 来判断一个对象是否是可迭代对象,是否是迭代器对象
-
可迭代对象(Iterable): 表示有迭代能力的对象。在 collection.abc 的定义中,只要对象实现了能返回迭代器的 iter 方法就是一个可迭代对象
存疑点:基于可迭代对象的概念,实现了 getitem 方法而且其参数是从零开始的索引的对象,也应该是可迭代对象,但是在 collection.abc 中不是这么认为的
-
迭代器对象(Iterator):在迭代的过程中可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,遍历的方向只能往前不会后退
根据 collection.abc 中的定义,只要对象同时实现了用于返回迭代器对象的 iter 和用于获取集合的下一个元素的 next ,便称这个对象是迭代器。而因为本身是迭代器,故 iter 可以返回self本身
-
-
next:在 next(对象) 时调用,用于返回对象某个指定属性的下一个元素
-
reversed:在 reversed(对象) 时调用,用于倒序返回对象某个指定属性
-
-
可调用模拟
- call:在 对象() 时调用。定义了 call 的对象称为可调用对象(callable),可以像函数一样使用()执行对象在 call 中定义好的代码
-
上下文管理
- enter:在使用with语句时,会调用with语句后所跟的对象中实现的 enter 方法,用于对对象进行预处理以及返回在with语句块内所需要使用到的内容。如果该对象没有实现 enter 方法,则with语句会报 AttributeError异常
- exit:在使用with语句时,当已经执行完with代码块内代码,或者是with代码块内出现异常时,会在对象的__exit__中进行结束处理。可接收三个参数,分别时exc_type,exc_val,exc_tb三个参数,用于异常信息的打印
-
实例创建和销毁
- new:在创建类的实例化对象时调用,通常会返回该类的一个实例
- init:在创建实例化对象时,在 new 后运行,用于对该实例化对象进行初始化赋值
- del:使用 del 对象 时调用,用于从内存中删除该对象
-
属性管理
-
getattribute:在 对象.属性、对象.函数()、getattr(对象, item)、hasattr(对象, item)、dir(对象)、对象.dict 时调用,用于获取对象所属命名空间中的属性或者方法
-
getattr:
在对象调用 getattribute 时,如果在对象的命名空间中找不到对应的属性或者方法,则会弹出 AttributeError异常 ,如果在类中实现了 getattr 则会调用 getattr ,用于返回一个找不到属性或者方法时的默认值。
如果对象中没有实现 getattr 并且获取属性、方法失败,则会弹出 AttributeError异常
-
setattr:在任何时候进行 对象.key = value 以及 setattr(对象, key, value) 时都会调用,用于对对象的属性或者方法进行赋值
-
delattr:在 del 对象.属性 或 del 对象.方法 时调用,用于删除对象的属性或者方法
-
dir:使用列表的形式输出对象中所有能够使用的属性或者方法
-
-
属性描述符
- get:当类中实现了 get ,且该类的实例化对象被当作是某个对象的属性时,那么 访问这个属性 就会执行类内的 get 方法
- set:当类中实现了 get、set ,且该类的实例化对象被当作是某个对象的属性时,那么 对这个属性进行赋值操作 就会执行类内的 set 方法
- delete:当类中实现了 get、delete ,且该类的实例化对象被当作是某个对象的属性时,那么 对这个属性进行赋值操作 就会执行类内的 delete 方法
-
跟类相关的服务
- prepare:类方法,用于在 new 之前生成类对象的命名空间
- instancecheck:当类中实现了 instancecheck ,并且该类的对象被作为 isinstance() 中第二个参数传入时执行,传入的参数为 isinstance() 中的第一个参数,一般定义在元类中,用于判断该参数是否为该类对象的实例
- subclasscheck:当类中实现了 subclasscheck ,并且该类的对象被作为 isinstance() 中第一个参数传入时执行,传入的参数为 isinstance() 中的第二个参数,一般定义在元类中,用于判断该参数是否为该类对象的父类
-
- 跟运算符相关的特殊方法
- 一元运算符
- neg:+对象
- pos:-对象
- abs:abs(对象)
- 众多比较运算符
- lt:<
- le:<=
- eq:==
- ne:!=
- gt:>
- ge:>=
- 算术运算符
- add:对象 + other
- sub:对象 - other
- mul:对象 * other
- turediv:对象 / other
- floordiv:对象 // other
- mod:对象 % other
- divmod:divmod(对象, other),返回包含商和余数的元组
- pow:对象 ** other
- round:round(对象, other),四舍五入
- 反向算术运算符
- radd:other + 对象
- rsub:other - 对象
- rmul:other * 对象
- rtruediv:other / 对象
- rfloordiv:other // 对象
- rmod:other % 对象
- rdivmod:divmod(other, 对象),返回包含商和余数的元组
- rpow:other ** 对象
- 增量赋值算术运算符
- iadd:对象 += other
- isub:对象 -= other
- imul:对象 *= other
- itruediv:对象 /= other
- ifloordiv:对象 //= other
- imod:对象 %= other
- ipow:对象 **= other
- 位运算符
- invert:~对象,按位取反
- lshift:对象 << other,向左位移other位
- rshift:对象 >> other,向右位移other位
- and:对象 & other,与操作
- or:对象 | other,或操作
- xor:对象 ^ other,按位异或
- 反向位运算符
- rlshift:other << 对象,other向左位移
- rrshift:other >> 对象,other向右位移
- rand:other & 对象,与操作
- rxor:other | 对象,或操作
- ror:other ^ 对象,按位异或
- 增量赋值位运算符
- ilshift:对象 <<= other,向左位移,需要返回对象本身
- irshift:对象 >>= other,向右位移,需要返回对象本身
- iand:对象 &= other,原地进行与操作
- ixor:对象 |= other,原地进行或操作
- ior:对象 ^= other,原地进行按位异或操作
- 一元运算符