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')