Chcę iterować po metodach w klasie lub obsługiwać obiekty klasy lub instancji inaczej w zależności od obecnych metod. Jak uzyskać listę metod klasowych?
Zobacz także:
- Jak mogę wyświetlić listę metod w module Python 2.5?
- Pętla nad metodami obiektowymi Python / IronPython
- Znajdowanie metod, które posiada obiekt
- Jak zajrzeć do obiektu Python?
- Jak przeprowadzić introspekcję na obiekcie w Pythonie 2.x?
- Jak uzyskać pełną listę metod i atrybutów obiektu?
- Dowiedz się, które funkcje są dostępne z instancji klasy w Pythonie?
binding
działa: stackoverflow.com/a/46041480/1959808[f for f in dir(ClassName) if not f.startswith('_')]
lub po prostudir(ClassName)
na wszystkoOdpowiedzi:
Przykład (zawierający listę metod
optparse.OptionParser
klasy):Zauważ, że
getmembers
zwraca listę 2-krotek. Pierwszy element to nazwa członka, drugi element to wartość.Możesz także przekazać instancję do
getmembers
:źródło
inspect.isroutine
może być bardziej odpowiednim orzeczeniem;inspect.ismethod
nie działa dla metod wszystkich obiektów.Istnieje
dir(theobject)
metoda wylistowania wszystkich pól i metod twojego obiektu (jako krotki) oraz moduł inspekcji (jako zapis kodu), aby wyświetlić listę pól i metod wraz z ich dokumentem (w „” „”).Ponieważ wszystko (nawet pola) może być wywoływane w Pythonie, nie jestem pewien, czy istnieje wbudowana funkcja do wyświetlania tylko metod. Możesz spróbować, jeśli obiekt , przez który przejdziesz,
dir
można wywołać, czy nie.źródło
Odpowiedź na Python 3.x bez bibliotek zewnętrznych
wynik wykluczony z dundera:
źródło
Powiedz, że chcesz poznać wszystkie metody związane z klasą listy. Wpisz następujące
Powyżej podasz wszystkie metody klasy listy
źródło
print([ m for m in dir(my_class) if not m.startswith('__')])
Wypróbuj nieruchomość
__dict__
.źródło
__dict__
. Jednak klasy też mają__dict__
i powinny wyświetlać metody klasowe :)możesz również zaimportować FunctionType z typów i przetestować go za pomocą
class.__dict__
:źródło
and not x.startswith('_')
do końca listy zrozumienie dla mojego użycia do ignorowania__init__
metod prywatnych i.import
zFunctionType
przy użyciu lambda wyrzucenie ztype()
:type(lambda:0)
isinstance
byłoby lepiej niżtype(y) == FunctionType
tutaj.Zauważ, że musisz rozważyć, czy chcesz, aby metody z klas podstawowych, które są dziedziczone (ale nie przesłonięte), zostały uwzględnione w wyniku.
dir()
Iinspect.getmembers()
operacje zrobić to bazowych metod klasy, ale użycie__dict__
atrybutu nie.źródło
Działa to również:
mymodule.py
W innym pliku
wynik:
Z dokumentacji Pythona:
inspect.isroutine (obiekt)
źródło
Więc
Pomyśl o języku Python na stronie 210
źródło
Istnieje takie podejście:
Kiedy mamy do czynienia z instancją klasy , być może lepiej byłoby zwrócić listę z referencjami do metod, a nie tylko z nazwami¹. Jeśli to twój cel, jak również
import
__init__
) Z listyMoże się przydać. W skrócie, dla klasy takiej jak
Możemy sprawdzić pobieranie instancji za pomocą
Możesz więc od razu to nazwać:
¹ Przypadek użycia:
Użyłem tego do testów jednostkowych . Miał klasę, w której wszystkie metody przeprowadzały odmiany tego samego procesu - co prowadziło do długich testów, z których każda była tylko drobną modyfikacją. SUCHO było odległym snem.
Pomyślałem, że powinienem mieć jeden test dla wszystkich metod, więc zrobiłem powyższą iterację.
Chociaż zdałem sobie sprawę, że powinienem zrefakturować sam kod tak, aby był zgodny z DRY ... to może nadal służyć losowej, nikczemnej duszy w przyszłości.
źródło
Po prostu trzymam to tam, ponieważ najwyżej oceniane odpowiedzi nie są jasne .
To prosty test z nietypową klasą opartą na Enum.
I to są wyniki wyjściowe.
Co mamy:
dir
podać niekompletne daneinspect.getmembers
podać niekompletne dane i podać klucze wewnętrzne, które nie są dostępne za pomocągetattr()
__dict__.keys()
zapewniają pełny i niezawodny wynikDlaczego głosy są tak błędne? A gdzie się mylę? A gdzie są inne osoby, które mają tak mało głosów?
źródło
daje identyczną listę jak
robi.
źródło
Jeśli twoja metoda jest metodą „zwykłą”, a nie itd.
statimethod
,classmethod
Wpadłemna mały hack -
Można to rozszerzyć na inne metody, odpowiednio zmieniając „funkcję” w
if
warunku.Testowane na Pythonie 2.7.
źródło
Możesz wyświetlić listę wszystkich metod w klasie python, używając następującego kodu
Spowoduje to zwrócenie listy wszystkich nazw metod w klasie
źródło
Wiem, że to stary post, ale właśnie napisałem tę funkcję i zostawię ją tutaj, na wypadek, gdyby ktoś potknął się o odpowiedź:
źródło
To tylko spostrzeżenie. „kodowanie” wydaje się być metodą dla obiektów łańcuchowych
Jednak jeśli str1 jest sprawdzany pod kątem metod, zwracana jest pusta lista
Może się mylę, ale wydaje się, że problem nie jest prosty.
źródło
'a'
to obiekt, którego typem jeststr
. Możesz to zobaczyć, uruchamiająctype('a')
.inspect.getmember()
pobiera parametr typu, więc musisz zadzwonić,inspect.getmember(str)
aby zobaczyć, czego oczekujesz.wynik
źródło
Jeśli chcesz wyświetlić listę tylko metod klasy python
źródło