[python] 파이썬 객체가 가지고있는 메소드 찾기

어떤 종류의 파이썬 객체가 주어지면이 객체가 가지고있는 모든 메소드의 목록을 얻는 쉬운 방법이 있습니까?

또는,

이것이 가능하지 않은 경우, 메소드가 호출 될 때 단순히 오류가 발생하는지 확인하는 것 이외의 특정 메소드가 있는지 확인하는 쉬운 방법이 있습니까?



답변

많은 객체의 경우이 코드를 사용하여 ‘object’를 원하는 객체로 대체 할 수 있습니다.

object_methods = [method_name for method_name in dir(object)
                  if callable(getattr(object, method_name))]

diveintopython.net (지금 보관 됨) 에서 발견했습니다 . 바라건대, 더 자세한 내용을 제공해야합니다!

을 얻는 경우 AttributeError대신 다음을 사용할 수 있습니다 .

getattr(팬더 스타일 python3.6 추상 가상 하위 클래스에 대한 편견이 없습니다. 이 코드는 위와 동일하며 예외를 무시합니다.

import pandas as pd
df = pd.DataFrame([[10, 20, 30], [100, 200, 300]],
                  columns=['foo', 'bar', 'baz'])
def get_methods(object, spacing=20):
  methodList = []
  for method_name in dir(object):
    try:
        if callable(getattr(object, method_name)):
            methodList.append(str(method_name))
    except:
        methodList.append(str(method_name))
  processFunc = (lambda s: ' '.join(s.split())) or (lambda s: s)
  for method in methodList:
    try:
        print(str(method.ljust(spacing)) + ' ' +
              processFunc(str(getattr(object, method).__doc__)[0:90]))
    except:
        print(method.ljust(spacing) + ' ' + ' getattr() failed')


get_methods(df['foo']) 


답변

내장 dir()함수를 사용하여 모듈의 모든 속성 목록을 가져올 수 있습니다. 명령 행에서이를 시도하여 작동 방식을 확인하십시오.

>>> import moduleName
>>> dir(moduleName)

또한 hasattr(module_name, "attr_name")함수를 사용하여 모듈에 특정 속성이 있는지 확인할 수 있습니다 .

자세한 내용은 Python 내부 검사 안내서를 참조하십시오 .


답변

가장 간단한 방법은를 사용하는 것 dir(objectname)입니다. 해당 객체에 사용 가능한 모든 방법이 표시됩니다. 멋진 트릭.


답변

특정 방법이 있는지 확인하려면 다음을 수행하십시오.

hasattr(object,"method")


답변

나는 당신이 원하는 것이 다음과 같다고 믿습니다.

객체의 속성 목록

저의 겸손한 의견으로는 내장 함수 dir()가이 작업을 수행 할 수 있습니다. help(dir)Python Shell의 출력에서 가져온 것입니다 .

dir (…)

dir([object]) -> list of strings

인수없이 호출 된 경우 현재 범위의 이름을 반환하십시오.

그렇지 않으면, 주어진 객체의 속성과 그로부터 도달 할 수있는 속성을 포함하는 알파벳순으로 된 이름 목록을 반환합니다.

객체가라는 이름의 메소드를 제공하면 __dir__사용됩니다. 그렇지 않으면 기본 dir () 논리가 사용되고 다음을 리턴합니다.

  • 모듈 객체의 경우 : 모듈의 속성.
  • 클래스 객체의 경우 속성과 재귀 적으로 기본 속성입니다.
  • 다른 객체 : 속성, 클래스 속성 및 재귀 적으로 클래스 기본 클래스의 속성.

예를 들면 다음과 같습니다.

$ python
Python 2.7.6 (default, Jun 22 2015, 17:58:13)
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> a = "I am a string"
>>>
>>> type(a)
<class 'str'>
>>>
>>> dir(a)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__',
'__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__',
'__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'_formatter_field_name_split', '_formatter_parser', 'capitalize',
'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs', 'find',
'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower', 'isspace',
'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'partition',
'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip',
'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title',
'translate', 'upper', 'zfill']

문제를 확인하면서의 출력 형식을 개선하여 내 생각의 기차를 보여 주기로 결정했습니다 dir().

dir_attributes.py (Python 2.7.6)

#!/usr/bin/python
""" Demonstrates the usage of dir(), with better output. """

__author__ = "ivanleoncz"

obj = "I am a string."
count = 0

print "\nObject Data: %s" % obj
print "Object Type: %s\n" % type(obj)

for method in dir(obj):
    # the comma at the end of the print, makes it printing 
    # in the same line, 4 times (count)
    print "| {0: <20}".format(method),
    count += 1
    if count == 4:
        count = 0
        print

dir_attributes.py (Python 3.4.3)

#!/usr/bin/python3
""" Demonstrates the usage of dir(), with better output. """

__author__ = "ivanleoncz"

obj = "I am a string."
count = 0

print("\nObject Data: ", obj)
print("Object Type: ", type(obj),"\n")

for method in dir(obj):
    # the end=" " at the end of the print statement, 
    # makes it printing in the same line, 4 times (count)
    print("|    {:20}".format(method), end=" ")
    count += 1
    if count == 4:
        count = 0
        print("")

내가 기여하기를 바랍니다 :).


답변

더 직접적인 답변 외에도 iPython에 대해 언급하지 않았다면 나는 결심 할 것 입니다. 자동 완성 기능으로 사용 가능한 방법을 보려면 ‘탭’을 누르십시오.

그리고 일단 방법을 찾으면 다음을 시도하십시오.

help(object.method) 

pydocs, 메소드 서명 등을 보려면

아아 … 대체 .


답변

특별히 메소드를 원한다면 inspect.ismethod 를 사용해야합니다 .

메소드 이름의 경우 :

import inspect
method_names = [attr for attr in dir(self) if inspect.ismethod(getattr(self, attr))]

방법 자체 :

import inspect
methods = [member for member in [getattr(self, attr) for attr in dir(self)] if inspect.ismethod(member)]

때때로 inspect.isroutine“유지”컴파일러 지시어가없는 내장, C 확장, Cython의 경우 에도 유용 할 수 있습니다.