简单的说,@装饰器就是用来提供调用的,
def funA(arg):
print 'A'
a=arg()
@funA
def funB():
print 'B'
此处的@相当于funA(funB())。
当有多个装饰器时:
@deco1(deco_args)
@deco2
def func():pass
等价于:
func=deco1(deco_args) (deco2(func))
有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。
紧跟with后面的语句被求值后,返回对象的 __enter__() 方法被调用,这个方法的返回值将被赋值给as后面的变量。
当with后面的代码块全部被执行完之后,将调用前面返回对象的 __exit__()方法。
下面例子可以具体说明with如何工作:
#!/usr/bin/env python
# with_example01.py
class Sample:
def __enter__(self):
print "In __enter__()"
return "Foo"
def __exit__(self, type, value, trace):
print "In __exit__()"
def get_sample():
return Sample()
with get_sample() as sample:
print "sample:", sample
运行代码,输出如下
bash-3.2$ ./with_example01.py
In __enter__()
sample: Foo
In __exit__()
F7进入函数,F8跳过函数