2009-09-04 18 views
9

Ya habrás descubierto por mi uso de la terminología que soy un python n00b.lista de métodos para python shell?

recta hacia delante pregunta:

¿Cómo puedo ver una lista de los métodos para un objeto determinado en una cáscara de Python interactiva como puedo en rubí (se puede hacer eso en IRB rubí con un'después de la .methods objeto)?

Respuesta

17

respuestas existentes hacen un buen trabajo de mostrar cómo obtener los atributos de un objeto, pero no responden precisamente la cuestión que usted plantea - cómo conseguir los Métodos de un objeto. Los objetos de Python tienen un espacio de nombres unificado (diferente de Ruby, donde los métodos y atributos usan diferentes espacios de nombres). Considere por ejemplo:

>>> class X(object): 
... @classmethod 
... def clame(cls): pass 
... @staticmethod 
... def stame(): pass 
... def meth(self): pass 
... def __init__(self): 
...  self.lam = lambda: None 
...  self.val = 23 
... 
>>> x = X() 
>>> dir(x) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', 
'__getattribute__', '__hash__', '__init__', '__module__', 
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
'__sizeof__', '__str__', '__subclasshook__', '__weakref__', 
'clame', 'lam', 'meth', 'stame', 'val'] 

((salida dividida para facilitar la lectura)).

Como se puede ver, esto le está dando los nombres de todos los atributos - incluyendo un montón de métodos especiales que solo se heredan de object, los datos de atributos especiales tales como __class__, __dict__ y __doc__, atributos de datos por instancia (val) , atributos ejecutables por instancia (lam), así como los métodos reales.

Si y cuando se necesita para ser más selectivos, intente:

>>> import inspect 
>>> [n for n, v in inspect.getmembers(x, inspect.ismethod)] 
['__init__', 'clame', 'meth'] 

módulo de la biblioteca estándar inspect es la mejor manera de hacer una introspección en Python: construye en la parte superior de la incorporada en los ganchos de introspección (tales como dir y otros más avanzados) para ofrecerle servicios de introspección útiles, ricos y simples. Aquí, por ejemplo, puede ver que solo se muestran métodos de instancia y clase específicamente diseñados por esta clase, no métodos estáticos, atributos de instancia heredados o no, métodos especiales heredados de object. Si sus necesidades de selectividad son ligeramente diferentes, es fácil construir su propia versión ajustada de ismethod y pasarla como el segundo argumento de getmembers, para adaptar los resultados a sus necesidades precisas y exactas.

8

dir(object)

le dará la lista.

por ejemplo:

a = 2 
dir(a) 

, aparecerá una lista de todos los métodos que puede llamar a un número entero.

+0

funciona! gracias – potlee

2

hacer esto:

dir(obj) 
5
>>> help(my_object) 
+1

Esto no es realmente correcto. help se usa para mostrar la documentación docstring de un método. p.ej. ayuda (string.upper). dir (obj) es lo que se requiere. – mikej

+0

Correcto. Si se requiere algo como .methods in Ruby, dir (...) es la respuesta correcta. –

+0

Para uso interactivo (el caso de uso del OP), este es realmente el mejor enfoque. El sistema de ayuda imprimirá la documentación de 'my_object', incluida una lista de todos los métodos publicitados (tengan o no su propia docstring). No mostrará métodos con nombres que comiencen con '_', pero generalmente está bien, ya que dichos métodos están destinados al uso interno de la clase. – alexis

2

Otros han mencionado dir. Permítanme hacer un comentario de advertencia: los objetos de Python pueden tener un método __getattr__ definido que se llama cuando se intenta llamar a un método indefinido en dicho objeto. Obviamente, dir no enumera todos esos (infinitos) nombres de métodos. Algunas bibliotecas hacen uso explícito de esta característica, p. PLY (Python Lex-Yacc).

Ejemplo:

>>> class Test: 
...  def __getattr__(self, name): 
...   return 'foo <%s>' % name 
... 
>>> t = Test() 
>>> t.bar 
'foo <bar>' 
>>> 'bar' in dir(t) 
False 
+0

... y llevando a cabo la analogía de Ruby de la pregunta, una clase Ruby puede haber anulado method_missing que se invoca cuando hay un intento de llamar a un método indefinido y, por supuesto, obj.methods no puede saber sobre los nombres de los métodos que están destinados ser manejado por method_missing. – mikej

+0

@mikej: gracias! No tengo experiencia en Ruby, pero cuando escribí mi respuesta, se me pasó por la mente que Ruby debería tener una funcionalidad equivalente. – Stephan202

0

Si desea que sólo los métodos, a continuación,

def methods(obj): 
    return [attr for attr in dir(obj) if callable(getattr(obj, attr))] 

Pero probar IPython, que tiene la implementación del tabulador para los atributos de objeto, por lo que escribir obj.<tab> muestra una lista de los disponibles atributos en ese objeto.

+0

inactivo admite la finalización de pestañas también – SilentGhost

4

Python admite la implementación del tabulador como bien. Prefiero mi pitido de limpieza (así que no gracias a IPython), pero con la finalización de pestañas.

de instalación en .bashrc o similar:

PYTHONSTARTUP=$HOME/.pythonrc 

poner esto en .pythonrc:

try: 
    import readline 
except ImportError: 
    print ("Module readline not available.") 
else: 
    print ("Enabling tab completion") 
    import rlcompleter 
    readline.parse_and_bind("tab: complete") 

Se imprimirá "Activación del tabulador" cada vez que el símbolo del pitón se pone en marcha, porque es mejor ser explícito Esto no interferirá con la ejecución de scripts y programas de Python.


Ejemplo:

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

completar una ficha hace que el aviso estándar sea mucho más agradable; No sé por qué no está activado por defecto. También puede poner el código en su sitecustomize.py si desea evitar tener que establecer un INICIO (aunque en este caso, omitirá las impresiones). Tenga en cuenta que los usuarios de Windows y Mac no tendrán readline por defecto y necesitarán descargar un módulo apropiado como pyreadline (Win) o readline.py (Mac). – bobince

+0

Con sitecustomize.py puede influir en las aplicaciones de Python, mientras que PYTHONSTARTUP en .bashrc hace que solo importe readline cuando se inicia desde la línea de comandos. Esto es si entiendo sitecustomize.py correctamente. – u0b34a0f6ae

+0

Sí, si usan [raw_] input(). Sin embargo, es más probable que esto sea más útil que estropear todo. – bobince

4

Su sencillo hacer esto para cualquier objeto que haya creado

dir(object) 

devolverá una lista de todos los atributos del objeto.