python 自省1

get_attr()

inspect.stack()

inspect.stack()[1][3]返回的是函数名????



如何获取一个函数的名称:


经验:在函数A在调用函数B时在入参处调用函数C,等于函数A调用函数C,没B什么事?

import inspect

class a(object):
    def __init__(self):
        pass

    def get_function_name(self):
        print inspect.stack()
        return inspect.stack()[1][3]

    def func_a(self,name):
        print name


    def func_b(self):
        self.func_a(self.get_function_name())


if __name__ == '__main__':
    t1=a()
    t1.func_b()

"""
[(<frame object at 0x00F2DDA0>, 'D:\\1\\201503\\\xc3\xbf\\python\\reflect_test.py', 9, 'get_function_name', ['        print inspect.stack()\n'], 0), 
(<frame object at 0x00F2DC48>, 'D:\\1\\201503\\\xc3\xbf\\python\\reflect_test.py', 17, 'func_b', ['        self.func_a(self.get_function_name())\n'], 0),
 (<frame object at 0x00EC6030>, 'D:\\1\\201503\\\xc3\xbf\\python\\reflect_test.py', 22, '<module>', ['    t1.func_b()\n'], 0)]
func_b
"""

2

import inspect

class a(object):
    def __init__(self):
        pass

    def get_function_name(self):
        print inspect.stack()
        return inspect.stack()[1][3]

    def func_a(self,name):
        print name


    def func_b(self):
        self.func_a(self.get_function_name())

    def func_c(self):
        self.func_b()



if __name__ == '__main__':
    t1=a()
    t1.func_c()

"""
[(<frame object at 0x0107E030>, 'D:\\1\\201503\\\xc3\xbf\\python\\reflect_test1.py', 9, 'get_function_name', ['        print inspect.stack()\n'], 0),
 (<frame object at 0x00F32DA0>, 'D:\\1\\201503\\\xc3\xbf\\python\\reflect_test1.py', 17, 'func_b', ['        self.func_a(self.get_function_name())\n'], 0),
 (<frame object at 0x00F32C48>, 'D:\\1\\201503\\\xc3\xbf\\python\\reflect_test1.py', 20, 'func_c', ['        self.func_b()\n'], 0),
 (<frame object at 0x00EC4030>, 'D:\\1\\201503\\\xc3\xbf\\python\\reflect_test1.py', 25, '<module>', ['    t1.func_c()\n'], 0)]
func_b
"""

3

import inspect

class a(object):
    def __init__(self):
        pass

    def get_function_name(self):
        print inspect.stack()
        return inspect.stack()[1][3]

    def func_a(self,name):
        print name


    def func_b(self):
        self.func_a(self.get_function_name())

    def func_c(self):
        return self.get_function_name()

    def func_d(self):
        print self.func_c()


if __name__ == '__main__':
    t1=a()
    t1.func_d()

"""
[(<frame object at 0x01074030>, 'D:\\1\\201503\\\xc3\xbf\\python\\reflect_test2.py', 9, 'get_function_name', ['        print inspect.stack()\n'], 0),
 (<frame object at 0x00F2DDA0>, 'D:\\1\\201503\\\xc3\xbf\\python\\reflect_test2.py', 20, 'func_c', ['        return self.get_function_name()\n'], 0),
 (<frame object at 0x00F2DC48>, 'D:\\1\\201503\\\xc3\xbf\\python\\reflect_test2.py', 23, 'func_d', ['       print self.func_c()\n'], 0),
 (<frame object at 0x00EC6030>, 'D:\\1\\201503\\\xc3\xbf\\python\\reflect_test2.py', 28, '<module>', ['    t1.func_d()\n'], 0)]
func_c
"""






转载于:https://my.oschina.net/u/1858599/blog/542263

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值