python中可调用对象和上下文管理器的魔法方法
qingheluo2018-11-23清河洛240
可调用对象Python中一个特殊的魔法方法允许类的对象表现得像是函数(可以调用),把它们传递到使用函数做参数的函数中__call__():具有__call__()魔法方法的对象可以使用object()的形式被调用,即“调用”一个实例对象class T:
def __call__(self):
print(‘调用了__call__()方法‘)
a=T()
a()
调用了__call__()方法
上下文管理器在Python 2.5中引入了一个新的关键词with,上下文管理的概念在Python中并不是全新引入的(之前它作为标准库的一部分实现)with open(‘foo...
可调用对象
Python中一个特殊的魔法方法允许类的对象表现得像是函数(可以调用),把它们传递到使用函数做参数的函数中
__call__():具有__call__()魔法方法的对象可以使用object()的形式被调用,即“调用”一个实例对象
class T: def __call__(self): print(‘调用了__call__()方法‘) a=T() a() 调用了__call__()方法
上下文管理器
在Python 2.5中引入了一个新的关键词with,上下文管理的概念在Python中并不是全新引入的(之前它作为标准库的一部分实现)
with open(‘foo.txt‘) as file: # 使用file进行某些操作
当对象使用with声明创建时,上下文管理器允许类做一些设置和清理工作。上下文管理器的行为由下面两个魔法方法所定义:
__enter__(self):定义使用 with 声明创建的语句块最开始上下文管理器应该做些什么。__enter__()的返回值会赋给with声明的变量,也就是as之后的file。
__exit__(self, exception_type, exception_value, traceback):定义当 with 声明语句块执行完毕(或终止)时上下文管理器的行为。它可以用来处理异常,进行清理,或者做其他应该在语句块结束之后立刻执行的工作。如果语句块顺利执行, exception_type , exception_value 和 traceback 会是 None 。否则,你可以选择处理这个异常或者让用户来处理。如果你想处理异常,确保__exit__在完成工作之后返回True 。
class Foo: def __init__(self, obj): self.obj = obj def __enter__(self, obj): return self.obj # 绑定到目标 def __exit__(self, exception_type, exception_value, traceback): try: self.obj.close() except AttributeError: # obj不是可关闭的 print ‘Not closable.‘ return True # 成功地处理了异常
Python标准库包含一个contextlib模块,里面有一个上下文管理器contextlib.closing()基本上和我们的包装器完成的是同样的事情(但是没有包含任何当对象没有close()方法时的处理)。