Python魔术方法,,1. 查看属性  方


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对象

技术分享

Python魔术方法

评论关闭