包含在类中 用于实现特殊功能 在执行一些特殊操作时会被调用 一般由前后两个下划线组成
来源 继承于基类object 基类中定义了很多特殊方法
协议机制 定义某些方法绑定某些任务 如果想执行该任务 直接使用魔法方法即可
自省机制定义 在程序中执行过程中对对象进行检查、描述 作用、属性方法等
自省函数 dir、id、type、help、isinstance等
作用 让程序功能更灵活、更好实现
例子
dir(print) # [ __call__ , __class__ , __delattr__ , __dir__ , __doc__ , __eq__ ...]_repr_和__str__方法
定义 当对象被转换为字符串时自动调用这两个方法
两者的区别
__repr__ 类似将对象重写 无论以字符串输出还是对象本身 都会调用该方法
__str__ 只有将对象以字符串输出才会调用 读取对象本身不调用
__del__方法定义 当对象被回收时调用此方法 类似于C 中的析构函数
注意 当不删除对象 程序结束时也会自动调用该方法
__dict__方法定义 返回一个字典 可查看对象中所有属性和对应的值
class Test: def __init__(self): self.name bang ; if __name__ __main__ : test Test() print(test.__dict__) # 返回所有属性的一个字典 print(test.__dict__[ name ]) print(test.name) # 两者的返回值相同__len__方法
定义 当对象作为len函数的参数时 自动调用此方法
注意点 基类object中并没有定义该魔法方法 该方法的返回值必须为整数int
__call__方法定义 使得对象可以被调用、当对象被调用时 将自动执行此方法 可定义参数
class Test(object): def __call__(self, num): print(num) if __name__ __main__ : test Test() test(2) # 2__doc__方法
定义 查看对象的帮助文档 作用和help函数一致 help函数实际是调用该方法
__slots__方法定义 限制为类和对象添加属性和方法
好处 为约定的属性名或方法名建立’描述符’ 访问速度更快 对象占用内存更小
坏处 动态灵活性不存在
class Test: __slots__ [ name ] # 在列表中定义可以添加的属性或方法名__iter__和__next__方法
定义 使对象可以被迭代 并且每次迭代时返回一些东西 遍历过程就是迭代 迭代特点是只能往前
作用 iter返回的对象即为可迭代对象 每次迭代是什么内容则看next方法返回什么
使用案例
class Test: def __init__(self): self.num 0 def __iter__(self): return self # 将当前对象变成可迭代对象 def __next__(self): if self.num 10: raise StopIteration: # 当返回这个异常时 终止迭代 else: self.num 1 return self.num if __name__ __main__ : test Test() for i in test: print(i) # 输出1 - 11__enter__和__exit__方法
定义 用于创建 上下文管理器 对象
Python中’上下文’对象’ 可以定义一个对象一开始要做什么 最后要做什么
with语句 用于执行 上下文管理器 一般在打开文件使用最多
作用 以更优雅的方式操作资源 例如 文件操作、网络操作、访问数据库等



