python的魔术方法大全与属性
魔法方法指南
Python魔法方法指南: https://github.com/MrKiven/PyZh/blob/master/docs/python-magic-methods-guide.rst
魔术方法和内建属性
Python中有大量类似__dict__
这种以双下划线开头和结尾
的特殊成员及“魔法方法”,它们有着非常重要的地位和作用,也是Python语言独具特色的语法之一!重写魔术方法可以实现特殊功能~!当然重写前需明确其使用规则,不然很容易挖坑~
那么什么是魔术方法(魔法方法)
- 魔术方法都不需要调用,需要
触发
!每个魔术方法触发条件都不同 - 魔术方法都是在python事先定义好的,在定义方法的时候,不要使用魔术方法的命名规范
- 魔术方法是双划线开头,双划线结尾的
查看魔术方法和属性
import sys
class Person(object):
pass
def get_name():
pass
if __name__ == "__main__":
# print(dir()) # 当前文件的所有属性
# print(dir(sys)) # sys模块的所有属性
person = Person()
print(dir(get_name))
print(dir(Person))
print(dir(person))
# 结果
['__annotations__', '__call__', '__class__', '__closure__', '__code__', '__defaults__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__get__', '__getattribute__', '__globals__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__kwdefaults__', '__le__', '__lt__', '__module__', '__name__', '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
重要的内建属性,属性后是没有()的
# 取模块名、类名
if __name__ == "__main__":
pass
# 取注释
__doc__
# 存储对象属性的一个字典,其键为属性名,值为属性的值
__dict__
# 这个类的父类是谁
__bases__
# 内建模块,可以直接使用而不需要导入的函数就在内建模块中,例如str() dir()等
# builtns模块, 在python启动的时候自动导入的
__builtins__
# 当前模块对外的白名单,只允许 foo和bar对外提供服务
__all__ = ["foo", "bar"]
# 元类 https://zhuanlan.zhihu.com/p/311160583
# 元类可以改变类创建的过程,通常在框架中见到
__metaclass__
重要的魔术方法(不常用的就没有列出来)
# 用于动态加载类和函数
__import__(name[, globals[, locals[, fromlist[, level]]]])
# import目录加载顺序
# 1)系统内置模块 2)sys.path目录顺序
# 可以通过sys.path.append("目录/相对目录")来添加import的搜索路径
# 代码中的`文件名/函数名`除非重载不能与内置模块/第三方库相同
class test:
# ====基本魔法方法========================================================
# 【实例化时】创建对象的方法,当通过类去创建对象时就是调用__new__方法去创建的
__new__(cls[, ...])
# 【实例化后自动调用】初始化方法,当实例被创建的时候调用的初始化方法
__init__(self[, ...])
# 【内存中被释放时】析构方法,当实例被销毁的时候调用的方法
__del__(self)
# 允许一个类的实例像函数一样被调用:x(a, b) 调用 x.__call__(a, b)
__call__(self[, args...])
# ====常用属性相关========================================================
# 定义当用户试图【获取不存在的属性】时的行为,与反射getattr有关
__getattr__(self, name)
# 定义当一个【属性被设置时】的行为,与反射getattr有关
__setattr__(self, name, value)
# 定义当一个【属性被删除时】的行为,与反射getattr有关
__delattr__(self, name)
# 定义当该类的【属性被访问时】的行为,例如:self.abc时,注意这个方法中不能self.abc这样访问
__getattribute__(self, name)
# ====【描述器】=========================================================
#
# 定义当【描述符】的值被取得时的行为
__get__(self, instance, owner)
# 定义当【描述符】的值被改变时的行为
__set__(self, instance, value)
# 定义当【描述符】的值被删除时的行为
__delete__(self, instance)
# ====【上下文管理器】=========================================================
# 需配合 with 语句使用
# 定义当使用 with 语句进入上下文管理器执行的方法 ,__enter__ 的返回值被 with 语句的目标或者 as 后的名字绑定
__enter__(self)
# 当with中的代码块执行完毕后调用的方法。一般被用来处理异常,清除工作或者做一些代码块执行完毕之后的日常工作
__exit__(self, exc_type, exc_value, traceback)
# ====【容器类】=========================================================
# 定义当被 len() 调用时的行为(返回容器中元素的个数)
__len__(self)
# __getitem__ 、 __setitem__ 、 __delitem__
# 用于执行 [] 中括号相关的动作
# 获取容器中的元素时触发,例如 self[key]
__getitem__(self, key)
# 设置容器中的元素时触发,例如 self[key] = value
__setitem__(self, key, value)
# 删除容器中的元素时触发,例如 del self[key]
__delitem__(self, key)
# __iter__ 、 __next__
# 如果一个对象实现了__iter__, 那么它就是一个可迭代对象
# 如果既实现__iter__又实现__next__,那么它就是一个迭代器
__iter__(self)
__next__(self)
# 定义当使用成员测试运算符(in 或 not in)时的行为
__contains__(self, item)
最后更新于 2023-02-13 18:13:13 并被添加「」标签,已有 873 位童鞋阅读过。
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处
此处评论已关闭