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)

此处评论已关闭