Encontrar o que métodos de um objeto Python tem

votos
253

Dado um objeto Python de qualquer tipo, há uma maneira fácil de obter a lista de todos os métodos que este objeto tem?

Ou,

Se isso não for possível, existe, pelo menos, uma maneira fácil de verificar se ele tem um método específico que não seja simplesmente verificar se um erro ocorre quando o método é chamado?

Publicado 29/08/2008 em 16:05
fonte usuário
Em outras línguas...                            


15 respostas

votos
322

Parece que você pode usar este código, substituindo 'objeto' com o objeto que você está interessado: -

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

Eu descobri-lo em este site , espero que deve fornecer algum detalhe adicional!

Respondeu 29/08/2008 em 16:09
fonte usuário

votos
147

Você pode usar o construída em dir()função para obter uma lista de todos os atributos de um módulo tem. Tente isto na linha de comando para ver como ele funciona.

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

Além disso, você pode usar a hasattr(module_name, "attr_name")função de descobrir se um módulo tem um atributo específico.

Consulte o Guia para Python introspecção para mais informações.

Respondeu 29/08/2008 em 16:36
fonte usuário

votos
35

O método mais simples é a utilização de dir (-objeto). Ele irá exibir todos os métodos disponíveis para esse objeto. truque legal.

Respondeu 20/11/2013 em 17:06
fonte usuário

votos
24

Para verificar se ele tem um método particular:

hasattr(object,"method")
Respondeu 29/08/2008 em 16:40
fonte usuário

votos
18

No topo das respostas mais diretas, eu seria negligente se eu não mencionar ipython . Hit 'guia' para ver os métodos disponíveis, com autocompletar.

E uma vez que você tenha encontrado um método, tente:

help(object.method) 

para ver o pydocs, assinatura do método, etc.

Ahh ... REPL .

Respondeu 29/08/2008 em 16:47
fonte usuário

votos
14

Eu acredito que o que você quer é algo como isto:

uma lista de atributos de um objeto

Na minha humilde opinião, a função built-in dir()pode fazer este trabalho para você. Tomado de help(dir)saída no seu Python Shell:

dir (...)

dir([object]) -> list of strings

Se chamado sem um argumento, retornar os nomes no escopo atual.

Else, retornar uma lista em ordem alfabética dos nomes que compreendem (alguns) os atributos do objeto dado, e de atributos acessíveis a partir dele.

Se o objeto fornece um método chamado __dir__, ele será usado; caso contrário, a lógica dir () padrão é usado e retorna:

  • para um objeto módulo: atributos do módulo.
  • para um objecto de classe: os seus atributos, e os atributos de forma recursiva de suas bases.
  • para qualquer outro objeto: os seus atributos, os atributos de sua classe, e de forma recursiva os atributos de classes base de sua classe.

Por exemplo:

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

Como eu estava verificando o seu problema, eu decidi demonstrar minha linha de pensamento, com uma melhor formatação da saída 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("")

Espero que eu tenha contribuído :).

Respondeu 26/05/2016 em 14:58
fonte usuário

votos
7

Se você quer especificamente métodos , você deve usar inspect.ismethod .

Para nomes de métodos:

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

Para os métodos de si:

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

Às vezes inspect.isroutinepode ser útil também (para o built-ins, extensões C, Cython sem a "ligação" diretiva de compilação).

Respondeu 29/01/2015 em 17:10
fonte usuário

votos
5

O problema com todos os métodos indicados aqui é que você não pode ter certeza que um método não existe.

Em Python você pode interceptar o ponto chamando através de __getattr__e __getattribute__, o que torna possível a criação de método "em tempo de execução"

Exemplo:

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

Se você executá-lo, você pode chamar o método existente não no dicionário de objetos ...

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

E é por isso que você use o mais fácil pedir perdão do que permissão paradigmas em Python.

Respondeu 09/12/2014 em 14:02
fonte usuário

votos
2

A maneira mais simples para obter a lista de métodos de qualquer objeto é usar help()o comando.

%help(object)

Ele irá listar todos os métodos disponíveis / importantes associados a esse objeto.

Por exemplo:

help(str)
Respondeu 26/04/2018 em 19:32
fonte usuário

votos
2

shell bash Open (ctrl + alt + T no Ubuntu). Iniciar shell python3 nele. Criar o objeto para observar métodos de. Basta adicionar um ponto após ele e pressione duas vezes "guia" e você verá algo assim:

 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.
 >>> s = "Any object. Now it's a string"
 >>> s. # here tab should be pressed twice times
 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(           
Respondeu 15/11/2017 em 20:56
fonte usuário

votos
2

Não há nenhuma maneira confiável para listar todos os métodos do objeto. dir(object)geralmente é útil, mas em alguns casos pode não listar todos os métodos. De acordo com a dir()documentação : "Com um argumento, tentar retornar uma lista de atributos válidos para esse objeto."

Verificando que o método existente pode ser feito callable(getattr(object, method))como já mencionado lá.

Respondeu 16/09/2015 em 12:13
fonte usuário

votos
2

Pode-se criar uma getAttrsfunção que irá retornar nomes de propriedade que pode ser chamado de um objeto

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

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

Isso iria voltar

['__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']
Respondeu 24/04/2015 em 15:37
fonte usuário

votos
1

... há, pelo menos, uma maneira fácil de verificar se ele tem um método específico que não seja simplesmente verificar se um erro ocorre quando o método é chamado

Enquanto " mais fácil pedir perdão do que permissão " é certamente o caminho Pythonic, o que você está procurando, talvez:

d={'foo':'bar', 'spam':'eggs'}
if 'get' in dir(d):
    d.get('foo')
# OUT: 'bar'
Respondeu 26/03/2013 em 15:51
fonte usuário

votos
0

A fim de procurar um método específico em um módulo inteiro

for method in dir(module) :
  if "keyword_of_methode" in method :
   print(method, end="\n")
Respondeu 09/03/2018 em 13:11
fonte usuário

votos
0

Dê uma lista como um objeto

obj = []

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

Você recebe:

['__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']
Respondeu 16/01/2018 em 15:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more