Posts Tagged ‘method name’
현재 클래스 이름, 메소드 이름, 라인 넘버 얻기
현재 실행하는 클래스의 이름과 메소드 이름, 라인 넘버를 얻어보자.
클래스의 인스턴스에서 호출한다는 가정하에,
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로 출력된다.
현재 클래스의 이름 얻기 + 현재 클래스의 메소드 얻기
1. 현재 클래스의 메소드 이름 얻기
class Base 에 대해,
Base.__dict__ 라고 하면, Base에 선언된 정보를 얻을 수 있으나,
이중, 메소드 이름만 추출하고 싶다면,
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.getMethodNames()
라고 하면, 데이터를 얻을 수 없다.
따라서, aa 로부터 instance하기 전의 클래스가 무엇인지 알아내야 한다.
라고 하면, 현재의 클래스를 리턴한다.
따라서, 위의 for 문에서
라고 쓰면 된다.
이때, 클래스의 이름을 self.__class__.__name__ 으로 하여 확인할 수도 있는데,
동일한 결과물을 뽑아준다.
즉, class와 eval(class의 이름)이 동일하게 취급된다는 것.