source

Python 개체의 메서드 찾기

gigabyte 2023. 2. 1. 21:50
반응형

Python 개체의 메서드 찾기

어떤 종류의 Python 오브젝트라도 이 오브젝트가 가지고 있는 모든 메서드의 목록을 쉽게 얻을 수 있는 방법이 있을까요?

아니면...

이것이 불가능할 경우, 단순히 메서드를 호출했을 때 오류가 발생하는지 확인하는 것 외에 특정 메서드가 있는지 확인하는 쉬운 방법이 있습니까?

많은 객체의 경우 이 코드를 사용하여 'object'를 관심 객체로 대체할 수 있습니다.

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

diveintopython.net(현재는 아카이브)에서 확인했습니다.자세한 내용은 이쪽에서 확인하실 수 있습니다.

를 취득했을 경우는, 대신에 다음과 같이 사용할 수 있습니다.

getattr()팬더 스타일의 Python 3.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 Exception:
        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 Exception:
        print(method.ljust(spacing) + ' ' + ' getattr() failed')

get_methods(df['foo'])

「」를 할 수 .dir()아트리뷰트명령줄에서 이 작업을 수행하여 작동 방식을 확인하십시오.

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

,을 할 수 .hasattr(module_name, "attr_name")모듈에 특정 속성이 있는지 여부를 확인하는 함수입니다.

자세한 내용은 Guide to Python Introspection을 참조하십시오.

은 '이렇게'를 사용하는 입니다.dir(objectname) 이 오브젝트에 할 수 있는 가 표시됩니다 이 오브젝트에 사용할 수 있는 모든 메서드가 표시됩니다.

난 네가 이런 걸 원한다고 믿어.

객체의 속성 목록

함수 " " "dir()네, 이렇게요.

help(dir)Python 쉘 python python :

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']

특정 메서드가 있는지 확인하려면:

hasattr(object,"method")

좀 더 직접적인 답변에 더해서, 아이피톤에 대해 언급하지 않았다면 저는 무심했을 것입니다.

자동 완료를 사용하여 사용 가능한 방법을 보려면 누르십시오.

그리고 방법을 찾은 후에는 다음을 시도해 보십시오.

help(object.method)

pydocs, 메서드 서명 등을 확인합니다.

... 리플.

은 '메서드 목록'을 입니다.help()명령어를 입력합니다.

help(object)

해당 개체와 관련된 사용 가능한/중요한 메서드가 모두 나열됩니다.

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

help(str)

구체적으로 메서드를 사용하는 경우 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)]

('바인딩' 컴파일러 디렉티브가 없는 빌트인, C 확장, Cython의 경우) 유용하기도 합니다.

Python Python이 .obj 그 , 그 주위에 방법들을 볼 수 있습니다.__(메서드 방식):

print(dir(obj))

마법의 빌트인을 제외하려면 다음 작업을 수행합니다.

[m for m in dir(obj) if not m.startswith('__')]

Bash Ctrl쉘을 엽니다(Ubuntu의 경우 + +).Python 3 쉘을 기동합니다.메서드를 관찰할 개체를 만듭니다.뒤에 점을 찍고 두 번 누르면 다음과 같은 내용이 나타납니다.

user@note:~$ python3
Python 3.4.3 (default, Nov 17 2016, 01:08:31)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import readline
>>> readline.parse_and_bind("tab: complete")
>>> s = "Any object. Now it's a string"
>>> s. # here tab should be pressed twice
s.__add__(           s.__rmod__(          s.istitle(
s.__class__(         s.__rmul__(          s.isupper(
s.__contains__(      s.__setattr__(       s.join(
s.__delattr__(       s.__sizeof__(        s.ljust(
s.__dir__(           s.__str__(           s.lower(
s.__doc__            s.__subclasshook__(  s.lstrip(
s.__eq__(            s.capitalize(        s.maketrans(
s.__format__(        s.casefold(          s.partition(
s.__ge__(            s.center(            s.replace(
s.__getattribute__(  s.count(             s.rfind(
s.__getitem__(       s.encode(            s.rindex(
s.__getnewargs__(    s.endswith(          s.rjust(
s.__gt__(            s.expandtabs(        s.rpartition(
s.__hash__(          s.find(              s.rsplit(
s.__init__(          s.format(            s.rstrip(
s.__iter__(          s.format_map(        s.split(
s.__le__(            s.index(             s.splitlines(
s.__len__(           s.isalnum(           s.startswith(
s.__lt__(            s.isalpha(           s.strip(
s.__mod__(           s.isdecimal(         s.swapcase(
s.__mul__(           s.isdigit(           s.title(
s.__ne__(            s.isidentifier(      s.translate(
s.__new__(           s.islower(           s.upper(
s.__reduce__(        s.isnumeric(         s.zfill(
s.__reduce_ex__(     s.isprintable(
s.__repr__(          s.isspace(

여기서 나타내는 모든 메서드의 문제는 메서드가 존재하지 않는다고 확신할 없다는 것입니다.

에서는 Python을 통해 닷할 수 .__getattr__ ★★★★★★★★★★★★★★★★★」__getattribute__ "untime메서드를 할 수 있습니다.

예:

class MoreMethod(object):
    def some_method(self, x):
        return x
    def __getattr__(self, *args):
        return lambda x: x*2

이 명령을 실행하면 개체 사전에 존재하지 않는 메서드를 호출할 수 있습니다.

>>> o = MoreMethod()
>>> o.some_method(5)
5
>>> dir(o)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattr__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'some_method']
>>> o.i_dont_care_of_the_name(5)
10

그래서 Python의 허가 패러다임보다 Easy를 사용하여 용서를 구하는 것입니다.

모든 개체의 메서드를 나열할 수 있는 신뢰할 수 있는 방법은 없습니다. dir(object)는 보통 도움이 되지만 경우에 따라서는 일부 메서드가 나열되지 않을 수 있습니다.문서에 따르면 "인수를 사용하여 해당 개체의 유효한 속성 목록을 반환해 보십시오."

이 메서드가 존재하는지 확인하는 방법은 다음과 같습니다.callable(getattr(object, method))이미 언급했듯이

import moduleName
for x in dir(moduleName):
    print(x)

이것으로 동작합니다. : )

했습니다.get_object_functions )를 object_)를 인수로 하고 오브젝트 클래스에 정의된 모든 메서드(스태틱 메서드 및 클래스 메서드 포함) 포함하는 목록()functions반환합니다.

def get_object_functions(object_):
    functions = [attr_name
                 for attr_name in dir(object_)
                 if str(type(getattr(object_,
                                     attr_name))) in ("<class 'function'>",
                                                      "<class 'method'>")]
    return functions

이 같은지 확인만 합니다'와 같은지 합니다."<class 'function'>" ★★★★★★★★★★★★★★★★★」"<class 'method'>" 속성을 "Attribute"에 합니다.functions람람라면 .True.


데모

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce(self):
        print(f'My name is {self.name}')

    @staticmethod
    def say_hi():
        print('hi')

    @classmethod
    def reproduce(cls, name):
        return cls(name, 0)


person = Person('Rafael', 27)
print(get_object_functions(person))

산출량

['__init__', 'introduce', 'reproduce', 'say_hi']

코드의 보다 깨끗한 버전의 경우: https://github.com/revliscano/utilities/blob/master/get_object_functions/object_functions_getter.py

를 생성할 수 있습니다.getAttrs객체의 호출 가능한 속성 이름을 반환하는 함수

def getAttrs(object):
  return filter(lambda m: callable(getattr(object, m)), dir(object))

print getAttrs('Foo bar'.split(' '))

그것은 돌아올 것이다.

['__add__', '__class__', '__contains__', '__delattr__', '__delitem__',
 '__delslice__', '__eq__', '__format__', '__ge__', '__getattribute__', 
 '__getitem__', '__getslice__', '__gt__', '__iadd__', '__imul__', '__init__', 
 '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', 
 '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', 
 '__setattr__', '__setitem__', '__setslice__', '__sizeof__', '__str__', 
 '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 
 'remove', 'reverse', 'sort']

목록을 개체로 가져오기

obj = []

list(filter(lambda x:callable(getattr(obj,x)),obj.__dir__()))

다음과 같은 이점을 얻을 수 있습니다.

['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__dir__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__iadd__',
 '__imul__',
 '__init__',
 '__init_subclass__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__reversed__',
 '__rmul__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 'append',
 'clear',
 'copy',
 'count',
 'extend',
 'index',
 'insert',
 'pop',
 'remove',
 'reverse',
 'sort']

...메서드가 호출되었을 때 오류가 발생하는지 확인하는 것 외에 특정 메서드가 있는지 확인하는 간단한 방법이 적어도 있습니까?

"허락보다 용서를 구하는 것이 더 쉽다"는 것은 분명 피토닉식 방법이지만, 여러분은 다음과 같은 것을 찾고 있을 것입니다.

d={'foo':'bar', 'spam':'eggs'}
if 'get' in dir(d):
    d.get('foo')
# OUT: 'bar'

모듈 전체에서 특정 메서드를 검색하려면

for method in dir(module) :
  if "keyword_of_methode" in method :
   print(method, end="\n")

예를 들어 shell plus를 사용하는 경우 대신 다음을 사용할 수 있습니다.

>> MyObject??

이렇게 하면 오브젝트 바로 뒤에 '?'를 붙이면 클래스의 모든 속성/특징이 표시됩니다.

Python에서 미리 정의된 dir()를 사용할 수 있습니다.

import module_name
dir(module_name)

오브젝트를 dir()에 전달할 수도 있습니다.

dir(object_name)

객체가 int, str 등 미리 정의된 클래스의 객체인 경우 메서드가 표시됩니다(이러한 메서드는 빌트인 함수로 알고 있을 수 있습니다).해당 개체가 사용자 정의 클래스에 대해 생성된 경우 해당 클래스에 지정된 모든 메서드가 표시됩니다.

여기 좋은 라이너가 하나 있습니다(단, 특성도 있습니다).

print(*dir(obj), sep='\n')

대부분의 경우 사용자 정의 메서드를 보고 싶으며 '__'로 시작하는 기본 제공 속성은 보고 싶지 않습니다. 다음 코드를 사용할 수 있습니다.

object_methods = [method_name for method_name in dir(object) if callable(getattr(object, method_name)) and '__' not in method_name] 

예를 들어 이 클래스의 경우:

class Person: 
    def __init__(self, name): 
        self.name = name 
    def print_name(self):
        print(self.name)

위의 코드는 ['print_name']를 인쇄합니다.

언급URL : https://stackoverflow.com/questions/34439/finding-what-methods-a-python-object-has

반응형