第二章 面向对象—魔术方法
00 min
2024-4-23

5、查看属性

dir(obj)对于不同类型的对象obj具有不同的行为:
  • 如果对象是模块对象,返回的列表包含模块的属性名和变量名
  • 如果对象是类型或是类对象,返回的列表包含类的属性名,及它的祖先类的属性名
  • 如果是类的实例
    • 有__dir__方法,返回可迭代对象的返回值
    • 没有__dir__方法,则尽可能收集实例的属性名、类的属性和祖先类的属性名
  • 如果obj不写,返回列表包含内容不同
    • 在模块中,返回模块的属性和变量名
    • 在函数中,返回本地作用域的变量名
    • 在方法中,返回本地作用域的变量名
方法
意义
__dir__
返回类或对象的所有成员名称列表。dir()函数操作实例就是调用__dir__()
如果dir([obj])参数obj包含方法__dir__(),该方法将被调用。如果参数obj不包含__dir__(),该方法将最大程度地收集属性信息。
内建函数
  • locals()返回当前作用域中的变量字典
  • globals()当前模块全局作用域中的变量字典

6、魔术方法***

6.1 定义

魔法方法(Magic Method)是python内置方法,格式为:“__方法名__”,不需要主动调用,存在的目的是为了给python的解释器进行调用,几乎每个魔法方法都有一个对应的内置函数,或者运算符,当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法,可以理解为重写这些python的内置函数

6.2 分类

  • 创建、初始化与销毁
    • __new__
    • __init__与__del__
  • 可视化
  • hash
  • bool
  • 运算符重载
  • 容器和大小
  • 可调用对象
  • 上下文管理
  • 反射
  • 描述器

6.2.1 实例化

方法
意义
__new__
实例化对象;该方法需要返回一个值,如果该值不是cls的实例,则不会调用__init__;该方法永远是静态方法
__new__方法很少使用,即使创建了该方法,也会使用return super().__new__(cls)基类object的__new__方法来创建实例并返回。

6.2.2 可视化

print对象时, 会自动调用对象的下面的魔术方法.
方法
意义
返回值类型
__str__
str()函数、format()函数、print()函数调用,需要返回对象的字符串表达。如果没有定义,就调用__repr__方法返回字符串表达,如果__repr__没有定义,就直接返回对象的内存地址信息
必须是字符串类型
__repr__
内建函数repr()对一个对象获取字符串表达。调用__repr__方法返回字符串表达,如果__repr__也没有定义,就直接返回对象的内存地址信息
不限定类型
__bytes__
bytes()函数调用,返回一个对象的bytes表达,即返回bytes对象
不限定类型
注意,通过打印1和’1’返回的结果相同 不能通过判断是否带引号来判断输出值的类型,类型的判断要使用type或isinstance
 

6.2.3 hash

方法
意义
__hash__
内建函数hash()调用的返回值,返回一个整数。如果定义这个方法,该类的实例就可hash。
 

[]实现

  • 为什么列表可以使用List[0]即可获取列表中下标0的元素?
  • 实现自定义对象通过[index] 操作对象中元素,包括访问、添加(修改)、删除对应元素,对应魔术方法为: __getitem__、__setitem__和__delitem__
__getitem__可以实现在定义字典类数据结构时,通过Tag()[’php’]方式来访问对应值
__setitem__可以实现通过Tag()[’php’]= value的方式对键对应的值进行修改或者添加没有的键值对。