with .. as ..
python 中的with as
# coding=utf8
__author__ = 'Administrator'
import inspect
class Test(object):
"""
测试__call__, __exit__, __enter__
作用:
1.简化代码
2.释放资源
3易于阅读
"""
def __init__(self, name):
self.name = name
def __enter__(self): # 在with后面的表达式取值后的对象中调用
print "func:{}".format(inspect.stack()[0][3])
def __exit__(self, exc_type, exc_val, exc_tb): # 结束后调用
frame_stack = inspect.stack()
print "func:{}".format(frame_stack[0][3]) # 返回函数名
print "func:{}".format(inspect.getframeinfo(frame_stack[0][0])) # 返回追踪信息
self.test()
def test(self):
print "func:{}".format(inspect.stack()[0][3])
if __name__ == "__main__":
with Test("ha") as test:
print "123"
运行结果
func:__enter__
123
func:__exit__
func:Traceback(filename='E:/Project/Actneed4/furion/test/test_built_in.py', lineno=21, function='__exit__', code_context=[' print "func:{}".format(inspect.getframeinfo(frame_stack[0][0]))\n'], index=0)
func:test
__call__
函数如果在类中被实现了,表示此类可以被直接调用(像对象调用方法一样),此时对象与函数的功能类似
例如:class_obj(arg1, arg2)
补充:inspect 库可以追踪一些信息,在这里用来获取当前函数名(函数内部获取)
函数外部获取函数,可以通过,getattr("obj", "name", default=None)
或是:obj.__getattribute__("func_name")