Python 클래스의 함수(메서드) 목록 열거하기
Python으로 개발하다 보면 특정 클래스 내부에 어떤 함수(메서드)들이 정의되어 있는지 한눈에 확인하고 싶을 때가 있습니다. 이럴 때 표준 라이브러리의 inspect 모듈을 사용하면 아주 간단하게 해결할 수 있습니다.
inspect.getmembers() 함수는 객체가 가진 멤버를 (이름, 값) 형태의 튜플 리스트로 반환해 줍니다. 여기에 predicate 인자로 inspect.ismethod를 전달하면 메서드만 골라서 필터링할 수 있습니다.
예제 코드
class foo:
def __init__(self):
self.x = x
def bar(self):
pass
def baz(self):
pass
import inspect
print(inspect.getmembers(foo, predicate=inspect.ismethod))
실행 결과
[('__init__', <unbound method foo.__init__>), ('bar', <unbound method foo.bar>), ('baz', <unbound method foo.baz>)]
출력 결과를 보면 클래스에 정의된 __init__, bar, baz 세 개의 메서드가 이름과 함께 순서대로 나열된 것을 확인할 수 있습니다.
참고: dir() 함수를 활용한 대체 방법
내장 함수인 dir()을 사용해서도 클래스의 멤버 목록을 얻을 수 있습니다. 다만 상속받은 내장 속성까지 모두 포함되기 때문에 원하는 결과만 얻으려면 추가로 필터링 작업이 필요합니다.
[m for m in dir(foo) if callable(getattr(foo, m)) and not m.startswith('__')]
반면 inspect.getmembers()는 predicate 조건 하나로 원하는 종류의 멤버만 깔끔하게 추출할 수 있어 훨씬 편리합니다. 참고로 Python 3 환경에서는 클래스 본문에 정의된 일반 함수까지 함께 확인하려면 inspect.isfunction을 조건으로 사용하는 것도 좋은 방법입니다.