一、简介
在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”(魔术方法),例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中有相应描述
这里有一篇博客讲得很详细,可以参考下:cnblogs.com/nmb-musen/p/10861536.html
二、with和上下文管理器
上下文管理协议:包含__enter()__ 和__exit()__方法
上下文管理器:支持“上下文管理协议对象”
几乎所有的人知道“with open”,这就时一个典型的上下文管理的例子
f = open('test.txt') #f就是一个上下文管理器 print(dir(f))
f中包含__enter()__ 和__exit()__方法,那么f就是一个上下文管理器
下面我们来理清几个概念:
1. 上下文表达式:with open('test.txt') as f: 2. 上下文管理器:open('test.txt') 3. f 不是上下文管理器,应该是资源对象
如何自己顶一个一个上下文管理器:
class Myclass(object): def __enter__(self): print('enter is running return 1 def __exit__(self, exc_type print('exit is running' return 2 def main(): obj = Myclass() with obj as o: print('with is running')
#执行: main() #输出结果: enter is running with is running exit is running
不懂没关系,我们再来看一段代码:
#自定义一个类不包含__enter__和__exit__方法 class Base(object) pass def main(): obj = Base() with obj as o: print('with is running')
#执行: main() #输出结果: AttributeError: __enter__
总结:在一个类里面实现了__enter()__ 和__exit()__方法,那么这个类就是一个上下文管理器,可以使用with调用
三、常见的魔术方法:
__str__方法:_str__
方法需要返回一个字符串,当做这个对象的描写
看下面一段代码:
class MyClass(object): def __init__(self, name): self.name = name def __str__(self): return self.name def main(): obj = MyClass('chenran') print(hasattr(obj, '__str__')) print(obj)
#执行: main() #输出结果: True CHENRAN