2009-09-04 15 views
9

Już się dowiedziałem przez użycie terminologii, że jestem pytonem n00b.lista metod dla powłoki Pythona?

prosto naprzód pytanie:

Jak mogę zobaczyć listę metod danego obiektu w interaktywnym Pythona skorupach jak mogę w Ruby (można to zrobić w ruby ​​IRB z”po .metody obiekt)?

Odpowiedz

17

Istniejące odpowiedzi zrobić dobrą robotę pokazując, w jaki sposób uzyskać atrybutów obiektu, ale nie dokładnie odpowiedzieć na pytanie postawione wy ​​- Jak uzyskać metodami obiektu. Obiekty Pythona mają ujednoliconą przestrzeń nazw (inaczej niż w Ruby, gdzie metody i atrybuty korzystają z różnych przestrzeni nazw). Rozważmy na przykład:

((podział produkcji dla czytelności)).

Jak widać, to daje Ci nazwy wszystkich atrybutów - w tym dużą ilością specjalnych metod, które są po prostu odziedziczonych object specjalne dane atrybuty takie jak __class__, __dict__ i __doc__ dane per-instancji atrybutów (val) , atrybuty wykonywalne na instancję (lam), a także rzeczywiste metody.

Jeśli i kiedy trzeba być bardziej selektywny, spróbuj:

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

Standardowy moduł biblioteki inspect jest najlepszym sposobem na introspekcji w Pythonie: buduje na górze wbudowanej haków introspekcji (takie jako dir i bardziej zaawansowane), aby zaoferować użyteczne, bogate i proste usługi introspekcji. Na przykład widać, że są wyświetlane tylko metody instancji i klasy specjalnie zaprojektowane przez tę klasę - a nie metody statyczne, a nie atrybuty instancji niezależnie od tego, czy można je wywoływać czy nie, a nie specjalne metody odziedziczone po object. Jeśli Twoje potrzeby w zakresie selektywności są nieco inne, możesz łatwo zbudować własną ulepszoną wersję ismethod i przekazać ją jako drugi argument getmembers, aby dopasować wyniki do swoich dokładnych, dokładnych potrzeb.

8

dir(object)

daje listę.

na przykład:

a = 2 
dir(a) 

pokaże się wszystkie metody można zadzwonić do liczby całkowitej.

+0

działa! dziękuję – potlee

2

Wykonaj:

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

To nie jest właściwie poprawne. pomoc służy do wyświetlania dokumentacji dokumentacji dla metody. na przykład help (string.upper). dir (obj) jest tym, co jest wymagane. – mikej

+0

Prawidłowo. Jeśli coś takiego jak .metety w Ruby jest wymagane, dir (...) jest poprawną odpowiedzią. –

+0

Do użytku interaktywnego (przypadek użycia OP), jest to najlepsze podejście. System pomocy wydrukuje dokumentację dla 'my_object', w tym listę wszystkich reklamowanych metod (niezależnie od tego, czy mają własny docstring). Nie będzie pokazywać metod o nazwach rozpoczynających się od _, ale zwykle jest to ok, ponieważ takie metody są przeznaczone do wewnętrznego użytku klasy. – alexis

2

Inni wspomniano dir. Pozwolę sobie zauważyć ostrożność: Obiekty Pythona mogą mieć zdefiniowaną metodę __getattr__, która jest wywoływana, gdy próbuje się wywołać niezdefiniowaną metodę na wymienionym obiekcie. Oczywiście dir nie wymienia wszystkich tych (nieskończenie wiele) nazw metod. Niektóre biblioteki wyraźnie korzystają z tej funkcji, np. PLY (Python Lex-Yacc).

Przykład:

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

... i kontynuując analogię Ruby do pytania, klasa Ruby mogła nadpisać metodę method_missing, która jest wywoływana, gdy pojawia się próba wywołania niezdefiniowanej metody, i oczywiście obj.methods nie może wiedzieć o nazwach metod, które są przeznaczone do obsłużenia metodą method_missing. – mikej

+0

@mikej: thanks! Nie mam doświadczenia z Ruby, ale kiedy napisałem odpowiedź, przeszło mi przez myśl, że Ruby powinna mieć taką samą funkcjonalność. – Stephan202

0

Jeśli chcesz tylko metod, następnie

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

Ale wypróbować ipython, ma zakończenie kartę do atrybutów obiektu, więc wpisując obj.<tab> pokazuje listę dostępnych atrybuty tego obiektu.

+0

Obsługa bezczynności tab-completion, jak również – SilentGhost

4

Python obsługuje zakończenie kartę jako dobrze. Wolę mój monit python clean (więc nie dzięki IPython), ale z uzupełnieniem karty.

Konfiguracja w .bashrc lub podobnym:

PYTHONSTARTUP=$HOME/.pythonrc 

umieścić to w .pythonrc:

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

będzie drukować „Włączanie zakończenie kartę” za każdym razem, szybka pyton rozpoczyna się, bo to lepiej być wyraźnym. Nie będzie to kolidować z wykonywaniem skryptów i programów Pythona.


Przykład:

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

Ukończenie zakładki +1 sprawia, że ​​standardowe zaproszenie staje się o wiele przyjemniejsze; Nie wiem, dlaczego domyślnie nie jest włączony. Możesz również umieścić kod w sitecustomize.py, jeśli chcesz uniknąć konieczności ustawiania STARTUP (chociaż w tym przypadku pomijasz wydruki). Zauważ, że użytkownicy Windowsa i Maca nie będą domyślnie mieć readline i będą musieli pobrać odpowiedni moduł, taki jak pyreadline (Win) lub readline.py (Mac). – bobince

+0

W sitecustomize.py może to wpływać na aplikacje Pythona, podczas gdy PYTHONSTARTUP w .bashrc sprawia, że ​​importuje on tylko readline po uruchomieniu z linii poleceń. Jest tak, jeśli rozumiem poprawnie sitecustomize.py. – u0b34a0f6ae

+0

To będzie tak, jeśli użyją [raw_] input(). Zasadniczo jest to raczej przydatne, niż zepsuć wszystko. – bobince

4

Jego prosta zrobić to za każdym utworzonym

dir(object) 

zwróci listę wszystkich atrybutów obiektu obiektu.