[python] 파이썬 클래스에서 메소드 목록을 어떻게 얻습니까?



답변

예제 ( optparse.OptionParser클래스 의 메소드 나열 ) :

>>> from optparse import OptionParser
>>> import inspect
#python2
>>> inspect.getmembers(OptionParser, predicate=inspect.ismethod)
[([('__init__', <unbound method OptionParser.__init__>),
...
 ('add_option', <unbound method OptionParser.add_option>),
 ('add_option_group', <unbound method OptionParser.add_option_group>),
 ('add_options', <unbound method OptionParser.add_options>),
 ('check_values', <unbound method OptionParser.check_values>),
 ('destroy', <unbound method OptionParser.destroy>),
 ('disable_interspersed_args',
  <unbound method OptionParser.disable_interspersed_args>),
 ('enable_interspersed_args',
  <unbound method OptionParser.enable_interspersed_args>),
 ('error', <unbound method OptionParser.error>),
 ('exit', <unbound method OptionParser.exit>),
 ('expand_prog_name', <unbound method OptionParser.expand_prog_name>),
 ...
 ]
# python3
>>> inspect.getmembers(OptionParser, predicate=inspect.isfunction)
...

getmembers2- 튜플 목록 을 반환합니다. 첫 번째 항목은 멤버의 이름이고 두 번째 항목은 값입니다.

인스턴스를 getmembers다음으로 전달할 수도 있습니다 .

>>> parser = OptionParser()
>>> inspect.getmembers(parser, predicate=inspect.ismethod)
...


답변

거기입니다 dir(theobject)목록의 모든 필드와 (튜플)를 개체의 메서드에 대한 방법과는 ( “” “에서) 자신의 의사와 필드와 방법을 나열 (codeape 쓰기로) 모듈을 검사합니다.

파이썬에서 모든 필드 (짝수 필드)가 호출 될 수 있기 때문에 메소드 만 나열하는 내장 함수가 있는지 확실하지 않습니다. 통과 하는 객체dir호출 가능한지 여부를 시도 할 수 있습니다 .


답변

외부 라이브러리가없는 Python 3.x 답변

method_list = [func for func in dir(Foo) if callable(getattr(Foo, func))]

던더 제외 결과 :

method_list = [func for func in dir(Foo) if callable(getattr(Foo, func)) and not func.startswith("__")]


답변

list class와 관련된 모든 메소드를 알고 싶다고 가정하십시오.

 print (dir(list))

위의 목록 클래스의 모든 방법을 제공합니다


답변

속성을 사용해보십시오 __dict__.


답변

유형에서 FunctionType을 가져 와서 다음과 같이 테스트 할 수도 있습니다 class.__dict__.

from types import FunctionType

class Foo:
    def bar(self): pass
    def baz(self): pass

def methods(cls):
    return [x for x, y in cls.__dict__.items() if type(y) == FunctionType]

methods(Foo)  # ['bar', 'baz']


답변

상속 된 (하지만 재정의되지는 않은) 기본 클래스의 메소드가 결과에 포함되는지 여부를 고려해야합니다. dir()inspect.getmembers()작업은 기본 클래스 메소드를 포함 할 수 있지만, 사용 __dict__속성은하지 않습니다.