everydayminder

learn something everyday

Posts Tagged ‘method name

현재 클래스 이름, 메소드 이름, 라인 넘버 얻기

leave a comment »

현재 실행하는 클래스의 이름과 메소드 이름, 라인 넘버를 얻어보자.

클래스의 인스턴스에서 호출한다는 가정하에,

def trace(obj, toList = False):
    import sys
    className = obj.__class__.__name__
    methodName = callersname()
    lineNumber = sys.exc_info()[2].tb_lineno
   
    if toList:
        return className, methodName, lineNumber
    else:
        return “%s.%s[%d]” % (className, methodName, lineNumber)

단, callersname()은

def callersname():
   return sys._getframe(2).f_code.co_name

그러나, 호출하는 클래스가 특정 클래스를 상속한 경우,
부모에 정의된 함수를 자식 클래스에서 그대로 사용하면서 trace()를 호출하였다면,
부모에 정의된 메소드를 실행하고 있더라도, 자식 클래스의 이름을
현재 클래스의 이름으로 리턴한다.

즉, A에 a()가 정의되어 있고, b = B(A)이나, b.a()를 실행도중 trace()를 호출하면,
현재 클래스의 이름이 A로 출력되는 대신 B로 출력된다.

Written by everydayminder

April 7, 2009 at 08:55

Posted in python

Tagged with , , ,

현재 클래스의 이름 얻기 + 현재 클래스의 메소드 얻기

leave a comment »

1. 현재 클래스의 메소드 이름 얻기

class Base 에 대해,

Base.__dict__ 라고 하면, Base에 선언된 정보를 얻을 수 있으나,
이중, 메소드 이름만 추출하고 싶다면,

from types import *

def getMethodNames():
  result = []
  for attr, val in Base.__dict__.items():
    if type(val) == FunctionType:
       result.append(attr)
  return result

과 같이 함으로써, method 이름을 추출할 수 있다.

2. 그러나,  이미 특정 class로부터 instance를 만든 경우에는 위의 방법을 그대로 사용할 수 없다.
즉, Base.getMethodNames()라고 하면 결과를 얻을 수 있지만,

aa = Base()
aa.getMethodNames()


라고 하면, 데이터를 얻을 수 없다.

따라서, aa 로부터 instance하기 전의 클래스가 무엇인지 알아내야 한다.

self.__class__

라고 하면, 현재의 클래스를 리턴한다.

따라서, 위의 for 문에서

Base.__dict__items()  대신, self.__class__.__dict__.items()

라고 쓰면 된다.

이때, 클래스의 이름을 self.__class__.__name__ 으로 하여 확인할 수도 있는데,

self.__class__.__dict__.itesm() 와 eval(self.__class__.__name__).__dict__.items()는
동일한 결과물을 뽑아준다.


즉, class와 eval(class의 이름)이 동일하게 취급된다는 것.

Written by everydayminder

February 4, 2009 at 08:51