python 部分魔法方法整理

Python 魔法方法

  • __doc__

  • 函数的文档字符串, 没有为 None; 不会被子类继承

  • __name__

  • 函数的名称

  • __qualname__

  • 该函数的 qualified name

  • __module__

  • 该函数所属模块的名称,没有则为 None

  • __defaults__

  • 由具有默认值的参数的默认参数值组成的元组,如无任何参数具有默认值则为 None。(列表等可变类型作为默认参数的坑)

  • __code__

  • 表示编译后的函数体的代码对象

  • __globals__

  • 对存放该函数中全局变量的字典的引用 — 函数所属模块的全局命名空间

  • __dict__

  • 命名空间支持的函数属性

  • __closure__

  • None 或包含该函数可用变量的绑定的单元的元组。有关 cell_contents 属性的详情见下

  • __annotations__

  • 包含参数标注的字典。字典的键是参数名,如存在返回标注则为 'return'

  • __kwdefaults__

  • 仅包含关键字参数默认值的字典

  • __new__(cls)

  • 调用以创建一个 cls 类的新实例

  • __init__(self)

  • 在实例 (通过__new__()) 被创建之后,返回实例之前调用。

  • __del__(self)

  • 在实例将被销毁时调用。

  • __repr__(self)

  • repr() 内置函数调用以输出一个对象的“官方”字符串表示。

  • __str__(self)

  • 可以使用更方便或更准确的描述信息。返回值必须为一个 字符串对象。此方法与 object.__repr__() 的不同点在于 __str__() 并不预期返回一个有效的 Python 表达式:可以使用更方便或更准确的描述信息。

  • __bytes__(self)

  • 通过 bytes 调用以生成一个对象的字节串表示

  • __format__(self, format_spec)

    • 通过 format()内置函数、扩展、格式化字符串字面值的求值以及 str.format()方法调用以生成一个对象的“格式化”字符串表示
  • __lt__(self, other)

    • 小于(x<y —> x.__lt__(y))
  • __le__(self, other)

    • <=
  • __eq__(self, other)

    • ==
  • __ne__(self, other)

    • !=

    • 默认情况下, 此方法会委托给 __eq__, 讲结果取反

  • __gt__(self, other)

    • >
  • __ge__(self, other)

    • >=
  • __hash__(self)

    • 应该返回一个整数, 对象比较结果相同所需的唯一特征属性是其具有相同的哈希值;建议的做法是把参与比较的对象全部组件的哈希值混在一起,即将它们打包为一个元组并对该元组做哈希运算。
  • __bool__(self)

    • 应该返回 True 或者 Flase
    • 如果未定义此方法,则会查找并调用 __len__()并在其返回非零值时视对象的逻辑值为真。
    • 如果一个类既未定义 __len__()也未定义__bool__()则视其所有实例的逻辑值为真。

自定义属性访问

可以定义下列方法来自定义对类实例属性访问(x.name 的使用、赋值或删除)的具体含义.

  • __getattr__(self, name)

    • 当默认属性访问因引发 AttributeError 而失败时被调用 ,可能是调用 __getattribute__() 时由于 name 不是一个实例属性或 self 的类关系树中的属性而引发了AttributeError
    • name 特性属性调用 __get__()时引发了 AttributeError。此方法应当返回(找到的)属性值或是引发一个 AttributeError 异常。
    • **请注意如果属性是通过正常机制找到的,__getattr__() 就不会被调用 **
  • __getattribute__(self, name)

    • 此方法会无条件地被调用以实现对类实例属性的访问
  • __setattr__(self, name, value)

    • 此方法在一个属性被尝试赋值时被调用
  • __dir__(self)

    • 此方法会在对相应对象调用 dir()时被调用。返回值必须为一个序列。 dir() 会把返回的序列转换为列表并对其排序。
  • __slots__

    • 允许我们显式地声明数据成员(例如特征属性)并禁止创建 dictweakref (除非是在 slots 中显式地声明或是在父类中可用。)

    • 相比使用 __dict__此方式可以显著地节省空间。 属性查找速度也可得到显著的提升

    • 注意事项

      • 当继承自一个未定义 slots 的类时,实例的 dictweakref 属性将总是可访问。
      • 没有 dict 变量,实例就不能给未在 slots 定义中列出的新变量赋值。尝试给一个未列出的变量名赋值将引发 AttributeError。新变量需要动态赋值,就要将 '__dict__' 加入到 slots 声明的字符串序列中。
      • slots 是通过为每个变量名创建描述器 (实现描述器) 在类层级上实现的。因此,类属性不能被用来为通过 slots 定义的实例变量设置默认值;否则,类属性就会覆盖描述器赋值
      • slots 声明的作用不只限于定义它的类。在父类中声明的 slots 在其子类中同样可用。不过,子类将会获得 dictweakref 除非它们也定义了 slots (其中应该仅包含对任何 额外 名称的声明位置)。
    • __call__(self, *args, **kwargs)

      • 此方法会在实例作为一个函数被“调用”时被调用;如果定义了此方法,则 x(arg1, arg2, ...) 就相当于 x.__call__(arg1, arg2, ...) 的快捷方式。
    • __len__(self)

      • 返回一个 >= 0的整数
    • __getitem__(self, key)

      • 调用此方法以实现 self[key] 的求值
    • __setitem__(self, key, value)

      • 调用此方法以实现向 self[key] 赋值
    • __iter__(self)

      • 此方法在需要为容器创建迭代器时被调用
    • __reversed__(self)

      • 此方法(如果存在)会被 reversed() 内置函数调用以实现逆向迭代
    • __contains__(self, itme)

      • 调用此方法以实现成员检测运算符 , in not in
    • __enter__(self)

      • 进入与此对象相关的运行时上下文。 with 语句将会绑定这个方法的返回值到 as 子句中指定的目标,如果有的话。
    • __exit__(self)

      • 退出关联到此对象的运行时上下文
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值