zoukankan      html  css  js  c++  java
  • 《流畅的Python》 第一部分 序章 【数据模型】

    流畅的Python

    致Marta,用我全心全意的爱

    第一部分 序幕

    第一章 Python数据模型

    特殊方法
    定义:

    Python解释器碰到特殊句法时,使用特殊方法激活对象的基本操作,例如python语句len(x) 调用了x.__ len __的方法。这些特殊方法支持以下的语言构架:

    • 迭代
    • 集合类
    • 属性访问
    • 运算符重载
    • 函数和方法的调用
    • 对象的创建和销毁
    • 字符串表示形式和格式化
    • 管理上下文(with块)
    命名规则:

    __ getitem __ (左右两个双下划线,故称为dunder method)

    使用方法:

    通过内置函数调用

    内置函数 对应的对象方法
    len(x) x.__ len __
    repr(x) x.__ repr __
    str(x) x.__ str __ (如果没有该方法,则调用 x.__ repr __ )
    bool(x) x.__ bool __ (如果没有该方法,则调用 x.__ len __ )
    x[i] x.__ getitem __
    in x x.__ contains __
    ... ......
    repr 与 str 方法
    • __ repr __ : 把对象用字符串的形式表达出来,当控制台打印实例时,调用repr方法输出,如果没有实现repr,则打印出来的字符串可能是< 类 对象 at 0x10e100070 >

    • __ str __ : 调用str()函数被使用,或是在用print函数打印一个对象被调用,并且它返回的字符串对终端用户更友好。

    • 如果只想实现一个方法,则选择__ repr __ ,因为当 __ str __ 没有实现时,__ repr __ 会作为替代。

    特殊地

    内置对象的特殊函数会直接返回相应的属性值(更快),比如列表、字符串、字节序列、CPython对于__ len __会直接返回PyVarObject里的ob_size属性。

    通过内置函数不仅可以调用内置对象,还可以调用自定义对象的方法,这种处理方式在保持内置类型的效率和保证语言的一致性之间找到了一个平衡点,达成了一定的统一。不能让特例特殊到破坏既定的规则。

    特殊方法一览
    #--------------跟字符串无关的特殊方法---------------------
    字符串 ``/``字节序列表示形式
      __repr__、 __str__、 __format__、 __bytes__
    数值转换
      __abs__、 __bool__、 __complex__、 __int__、 __float__、 __hash__、 __index__
    集合模拟
      __len__、 __getitem__、 __setitem__、 __delitem__、 __contains__
    迭代枚举
      __iter__、 __reversed__、 __next__
    可调用模拟
      __call__
    上下文管理
      __enter__、 __exit__
    实例创建和销毁
      __new__、 __init__、 __del__
    属性管理
      __getattr__、 __getattribute__、 __setattr__、 __delattr__、 __dir__
    属性描述符
      __get__、 __set__、 __delete__
    跟类相关的服务
      __prepare__、 __instancecheck__、 __subclasscheck__
        
    #--------------跟字符串相关的特殊方法---------------------
    一 元 运 算 符
        __neg__ -、 __pos__ +、 __abs__ abs()
    众多比较 运 算 符
        __lt__ <、 __le__ <=、 __eq__ ==、 __ne__ !=、 __gt__ >、 __ge__ >=
    算 术 运 算 符
        __add__ +、 __sub__ -、 __mul__ *、 __truediv__ /、 __floordiv__ //、 __mod__ %、 
        __divmod__ divmod()、 __pow__ ** 或pow()、 __round__ round()"
    反 向 算 术 运 算 符
        __radd__、 __rsub__、 __rmul__、 __rtruediv__、 __rfloordiv__、 __rmod__、 __rdivmod__、__rpow__
    增 量 赋 值 算 术 运 算 符
        __iadd__、 __isub__、 __imul__、 __itruediv__、 __ifloordiv__、 __imod__、 __ipow__
    位 运 算 符
        __invert__ ~、 __lshift__ <<、 __rshift__ >>、 __and__ &、 __or__ |、 __xor__ ^
    反 向 位 运 算 符
        __rlshift__、 __rrshift__、 __rand__、 __rxor__、 __ror__
    增 量 赋 值 位 运 算 符
        __ilshift__、 __irshift__、 __iand__、 __ixor__、 __ior__
    
  • 相关阅读:
    洛谷P3292 [SCOI2016]幸运数字 线性基+倍增
    2019牛客暑期多校第五场题解ABGH
    暑假集训-8.1总结
    主席树
    2019HDU多校第四场题解
    洛谷P4570 [BJWC2011]元素 线性基
    暑假集训-7.31总结
    线性基总结
    Proj. THUIoTFuzz Paper Reading: One Engine to Fuzz 'em All: Generic Language Processor Testing with Semantic Validation
    UVALive5876-Writings on the Wall-KMP
  • 原文地址:https://www.cnblogs.com/betternow/p/13591476.html
Copyright © 2011-2022 走看看