python 反射获取当前方法及参数
===
a = {'a': 123, 'b': 234, 'c': 345, 'd': 456, 'f': 'dir'}
b = {'aa': 1234, 'bb': 2345, 'cc': 3456, 'dd': 4567}
c = {'aaa': 12345, 'bbb': 23456, 'ccc': 34567, 'ddd': 45678}
class AA(object):
def __getattr__(self, name):
return a[name]
#print self[name] 如果使用这个,则下面的__getitem__方法必须
#def __getitem__(self, name):
#return a[name]
def __call__(self, name):
return a[name]
class BB(AA):
def __getattr__(self, name):
return b[name]
class CC(AA):
pass
class DD(AA):
def __getattr__(self, name):
#super(DD, self).__getattr__(name)
try:
return super(DD, self).__getattr__(name)
except:
return c[name]
a2 = AA()
print a2.a #调用__getattr__
print a2('a') #调用__call__
print getattr(locals()['__builtin__'], a2('f'))
b2 = BB()
print b2.a
print b2.aa
c2 = CC()
print c2.a
d2 = DD()
print d2.a
print d2.aaa
2.通过inspect库获取
import inspect
def get_current_function_name():
return inspect.stack()[1][3]
class MyClass(object):
def __init__(self):
print dir(self)
#def function_one(self, name='abc', key='cde', value='abcde', *args, **kwargs):
def function_one(self, *args, **kwargs):
#print self.__class__.__name__
#print globals()[self.__class__.__name__]
#print dir(inspect)
#print inspect.getargs(getattr(globals()[self.__class__.__name__], get_current_function_name()).__code__)
argvalues = inspect.getargvalues(inspect.currentframe())
#print dir(argvalues)
keys = argvalues.args
keys.append(argvalues.varargs)
keys.append(argvalues.keywords)
values = argvalues.locals
#import pdb;pdb.set_trace()
for k in keys:
print k, values[k], type(k)
if k == 'self':
getattr(values[k], 'abcde')()
def abcde(self):
print 'abcdefgh'
if __name__ == "__main__":
myclass = MyClass()
myclass.function_one('1', '2', a='abc', b='cde')