Python中常见的特殊方法

最前:磨磨蹭蹭总结了快半个月,内容比较多。整理不易,如果觉得有用的麻烦点个推荐

  • 跟运算符无关的特殊方法
    • 字符串/字节序列

      1. repr

        在使用 repr(对象) 输出对象信息时直接调用,或者使用 print(对象) 输出对象信息以及使用 str(对象) 转换对象格式,并且当对象没有定义 str 方法时间接调用

        返回值为字符串格式的文字描述

        一般用于为开发者提供对该对象的基本情况说明,输出内容包括该对象的类名以及各属性的值,可适当说明父类等其他描述

      2. 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(对象) 的可读性更强,是为使用者准备的

      3. 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 用于在函数内输出该函数的函数名

      4. bytes:在 bytes(对象) 时调用,一般用于返回bytes格式的对象描述

    • 数值转换

      1. abs:在 abs(对象) 时调用,一般用于返回对象某项属性的绝对值

      2. bool:在 bool(对象) 时调用,一般用于返回对象某项属性的布尔值

      3. complex:在 complex(对象) 时调用,一般用于返回对象某项属性的复数格式

      4. int:在 int(对象) 时调用,一般用于返回对象某项属性的整型格式

      5. float:在 float(对象) 时调用,一般用于返回对象某项属性的浮点型格式

      6. hash

        对象可哈希:若一个对象在其生命周期内保存不变,而且能与其他对象相比较,那么这个对象是可哈希的

        hash(对象)将对象添加进集合将对象作为字典的键等场景都会调用,返回由哈希算法计算出的该对象的哈希值

    • 集合模拟

      1. len:在 len(对象) 时调用,一般用于返回对象某个属性的长度

      2. getitem

        使用 对象[item] 取索引值或是 对象[start: end: step] 切片取值时调用

        该方法需要传进一个参数作为取值依据,当[]内只有一个值时,传进方法的参数是[]内的值,当[]内是使用:隔开的多个值,并且值的总数量不超过3个时,传进的参数是一个slice对象,使用:隔开的值分别对应slice对象的start、end、step,再使用slice对象进行切片操作

        需要返回取值结果

        拓展:

        1. 在使用 iter(对象) 希望能获取一个迭代器对象,同时对象没有实现 iter 时,解释器会使用 getitem 创建一个迭代器,并尝试按顺序(从索引0开始)获取元素
        2. 如果对象 itergetitem 都没有实现时,使用 iter(对象) 语句则会抛出 TypeError 异常
      3. setitem

        使用 对象[item] 对指定索引值赋值或是 对象[start: end: step] 切片赋值时调用

        该方法第一个参数如 getitem ,第二个参数为使用赋值号连接的值,一般使用该值替换掉取值范围的值

        不需要返回值

      4. delitem

        使用 del 对象[item] 删除指定索引值值或是 del 对象[start: end: step] 切片删除时调用

        具体使用方法如 getitem

        可以没有返回值

      5. contains:在 item in 对象 时调用,一般用于判断item是否在对象的某个属性值中,需要返回布尔类型的结果

    • 迭代枚举

      1. iter

        用于需要使用对象生成一个迭代器对象时调用,如:iter(对象)、使用 for语句 遍历对象、*对象

        拓展:

        1. 使用 collection.abc 里的 IterableIterator 配合 isinstance函数 来判断一个对象是否是可迭代对象,是否是迭代器对象

        2. 可迭代对象(Iterable): 表示有迭代能力的对象。在 collection.abc 的定义中,只要对象实现了能返回迭代器的 iter 方法就是一个可迭代对象

          存疑点:基于可迭代对象的概念,实现了 getitem 方法而且其参数是从零开始的索引的对象,也应该是可迭代对象,但是在 collection.abc 中不是这么认为的

        3. 迭代器对象(Iterator):在迭代的过程中可以记住遍历位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束,遍历的方向只能往前不会后退

          根据 collection.abc 中的定义,只要对象同时实现了用于返回迭代器对象的 iter 和用于获取集合的下一个元素的 next ,便称这个对象是迭代器。而因为本身是迭代器,故 iter 可以返回self本身

      2. next:在 next(对象) 时调用,用于返回对象某个指定属性的下一个元素

      3. reversed:在 reversed(对象) 时调用,用于倒序返回对象某个指定属性

    • 可调用模拟

      1. call:在 对象() 时调用。定义了 call 的对象称为可调用对象(callable),可以像函数一样使用()执行对象在 call 中定义好的代码
    • 上下文管理

      1. enter:在使用with语句时,会调用with语句后所跟的对象中实现的 enter 方法,用于对对象进行预处理以及返回在with语句块内所需要使用到的内容。如果该对象没有实现 enter 方法,则with语句会报 AttributeError异常
      2. exit:在使用with语句时,当已经执行完with代码块内代码,或者是with代码块内出现异常时,会在对象的__exit__中进行结束处理。可接收三个参数,分别时exc_type,exc_val,exc_tb三个参数,用于异常信息的打印
    • 实例创建和销毁

      1. new:在创建类的实例化对象时调用,通常会返回该类的一个实例
      2. init:在创建实例化对象时,在 new 后运行,用于对该实例化对象进行初始化赋值
      3. del:使用 del 对象 时调用,用于从内存中删除该对象
    • 属性管理

      1. getattribute:在 对象.属性对象.函数()getattr(对象, item)hasattr(对象, item)dir(对象)对象.dict 时调用,用于获取对象所属命名空间中的属性或者方法

      2. getattr

        在对象调用 getattribute 时,如果在对象的命名空间中找不到对应的属性或者方法,则会弹出 AttributeError异常 ,如果在类中实现了 getattr 则会调用 getattr ,用于返回一个找不到属性或者方法时的默认值。

        如果对象中没有实现 getattr 并且获取属性、方法失败,则会弹出 AttributeError异常

      3. setattr:在任何时候进行 对象.key = value 以及 setattr(对象, key, value) 时都会调用,用于对对象的属性或者方法进行赋值

      4. delattr:在 del 对象.属性del 对象.方法 时调用,用于删除对象的属性或者方法

      5. dir:使用列表的形式输出对象中所有能够使用的属性或者方法

    • 属性描述符

      1. get:当类中实现了 get ,且该类的实例化对象被当作是某个对象的属性时,那么 访问这个属性 就会执行类内的 get 方法
      2. set:当类中实现了 getset ,且该类的实例化对象被当作是某个对象的属性时,那么 对这个属性进行赋值操作 就会执行类内的 set 方法
      3. delete:当类中实现了 getdelete ,且该类的实例化对象被当作是某个对象的属性时,那么 对这个属性进行赋值操作 就会执行类内的 delete 方法
    • 跟类相关的服务

      1. prepare:类方法,用于在 new 之前生成类对象的命名空间
      2. instancecheck:当类中实现了 instancecheck ,并且该类的对象被作为 isinstance() 中第个参数传入时执行,传入的参数为 isinstance() 中的第个参数,一般定义在元类中,用于判断该参数是否为该类对象的实例
      3. subclasscheck:当类中实现了 subclasscheck ,并且该类的对象被作为 isinstance() 中第个参数传入时执行,传入的参数为 isinstance() 中的第个参数,一般定义在元类中,用于判断该参数是否为该类对象的父类
  • 跟运算符相关的特殊方法
    • 一元运算符
      1. neg:+对象
      2. pos:-对象
      3. abs:abs(对象)
    • 众多比较运算符
      1. lt:<
      2. le:<=
      3. eq:==
      4. ne:!=
      5. gt:>
      6. ge:>=
    • 算术运算符
      1. add:对象 + other
      2. sub:对象 - other
      3. mul:对象 * other
      4. turediv:对象 / other
      5. floordiv:对象 // other
      6. mod:对象 % other
      7. divmod:divmod(对象, other),返回包含商和余数的元组
      8. pow:对象 ** other
      9. round:round(对象, other),四舍五入
    • 反向算术运算符
      1. radd:other + 对象
      2. rsub:other - 对象
      3. rmul:other * 对象
      4. rtruediv:other / 对象
      5. rfloordiv:other // 对象
      6. rmod:other % 对象
      7. rdivmod:divmod(other, 对象),返回包含商和余数的元组
      8. rpow:other ** 对象
    • 增量赋值算术运算符
      1. iadd:对象 += other
      2. isub:对象 -= other
      3. imul:对象 *= other
      4. itruediv:对象 /= other
      5. ifloordiv:对象 //= other
      6. imod:对象 %= other
      7. ipow:对象 **= other
    • 位运算符
      1. invert:~对象,按位取反
      2. lshift:对象 << other,向左位移other位
      3. rshift:对象 >> other,向右位移other位
      4. and:对象 & other,与操作
      5. or:对象 | other,或操作
      6. xor:对象 ^ other,按位异或
    • 反向位运算符
      1. rlshift:other << 对象,other向左位移
      2. rrshift:other >> 对象,other向右位移
      3. rand:other & 对象,与操作
      4. rxor:other | 对象,或操作
      5. ror:other ^ 对象,按位异或
    • 增量赋值位运算符
      1. ilshift:对象 <<= other,向左位移,需要返回对象本身
      2. irshift:对象 >>= other,向右位移,需要返回对象本身
      3. iand:对象 &= other,原地进行与操作
      4. ixor:对象 |= other,原地进行或操作
      5. ior:对象 ^= other,原地进行按位异或操作
posted @ 2020-09-04 15:55  NotZY  阅读(531)  评论(0编辑  收藏  举报