1. 查看属性
方法: __dir__
意义: 返回类或者对象的所有成员名称列表。dir()函数就是调用__dir__()。如果提供__dir__(),则返回属性的列表,否则会尽量从__dict__属性中收集信息。
如果dir([obj])参数包含方法__dict__(),该方法将被调用。如果参数不包含__dir__(),该方法将最大限度地收集参数信息。
dir()对于不同类型的对象具有不同的行为:
如果对象是模块对象,列表包含模块的属性名。
如果对象是类型或者类对象,列表包含类的属性名,及它的基类的属性名。
否则,列表包含对象的属性名,它的类的属性名和类的基类的属性名。
# animal.py
# cat.py
2. 魔术方法
分类:
创建与销毁: __init__与__del__、hash:可哈希、bool:布尔、可视化、运算符重载、容器和大小、可调用对象、上下文管理、反射、描述器、其他杂项
方法:__hash__
意义:内建函数hash()调用的返回值,返回一个整数。如果定义这个方法该类的实例就可hash。
方法: __eq__
意义:对应于==操作符,判断2个对象是否相等,返回bool值
__hash__方法只是返回一个hash值作为set的key,但是去重还需要__eq__来判断2个对象是否相等。
hash值相等,只是hash冲突,不能说明两个对象是相等的。
因此,一般来说提供__hash__方法是为了作为set或者dict的key的,所以去重需要同时提供__eq__方法。
- 练习:设计二维坐标类Point,比较2个坐标是否相等?
思考:list类为什么不可hash?
源码中有一句__hash__=None,也就是如果调用__hash__()相当于None(),一定会报错。
所有类都继承自object,而这个类是具有__hash__()方法的,如果一个类不能被hash,就是把__hash__设置为None了。
方法:__bool__
意义:内建函数bool(),或者对象放在逻辑表达式的位置,调用这个函数返回布尔值。没有定义__bool__(),就找__len__()返回长度,非0为真。如果__len__()也没有定义,那么所有实例都返回真。
可视化:
方法:__repr__
意义:内建函数repr()对一个对象获取字符串表达。如果一个定义了__repr()但没有定义__str__,那么在请求该类的实例的“非正式”的字符串表示时也将调用__repr__()
方法:__str__
意义:str()函数、内建函数format、print()函数调用,需要返回对象的字符串表达
方法:__bytes__
意义:bytes的时候,返回一个对象的bytes表达,即返回bytes对象