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()
方法调用以生成一个对象的“格式化”字符串表示
- 通过 format()内置函数、扩展、格式化字符串字面值的求值以及
-
__lt__(self, other)
- 小于(x<y —> x.
__lt__
(y))
- 小于(x<y —> x.
-
__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__
-
允许我们显式地声明数据成员(例如特征属性)并禁止创建 dict 和 weakref (除非是在 slots 中显式地声明或是在父类中可用。)
-
相比使用 __dict__此方式可以显著地节省空间。 属性查找速度也可得到显著的提升
-
注意事项
- 当继承自一个未定义 slots 的类时,实例的 dict 和 weakref 属性将总是可访问。
- 没有 dict 变量,实例就不能给未在 slots 定义中列出的新变量赋值。尝试给一个未列出的变量名赋值将引发
AttributeError
。新变量需要动态赋值,就要将'__dict__'
加入到 slots 声明的字符串序列中。 - slots 是通过为每个变量名创建描述器 (实现描述器) 在类层级上实现的。因此,类属性不能被用来为通过 slots 定义的实例变量设置默认值;否则,类属性就会覆盖描述器赋值
- slots 声明的作用不只限于定义它的类。在父类中声明的 slots 在其子类中同样可用。不过,子类将会获得 dict 和 weakref 除非它们也定义了 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)
- 退出关联到此对象的运行时上下文
-