Frage

Gibt es bei einem beliebigen Python-Objekt eine einfache Möglichkeit, die Liste aller Methoden abzurufen, über die dieses Objekt verfügt?

Oder,

Wenn dies nicht möglich ist, gibt es dann zumindest eine einfache Möglichkeit, zu überprüfen, ob eine bestimmte Methode vorhanden ist, außer einfach zu prüfen, ob beim Aufruf der Methode ein Fehler auftritt?

War es hilfreich?

Lösung

Anscheinend können Sie diesen Code verwenden, indem Sie „Objekt“ durch das Objekt ersetzen, an dem Sie interessiert sind:

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

Ich habe es bei entdeckt Diese Seite.Hoffentlich liefert das weitere Details!

Andere Tipps

Sie können das eingebaute verwenden dir() Funktion, um eine Liste aller Attribute eines Moduls abzurufen.Probieren Sie dies in der Befehlszeile aus, um zu sehen, wie es funktioniert.

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

Sie können auch die verwenden hasattr(module_name, "attr_name") Funktion, um herauszufinden, ob ein Modul ein bestimmtes Attribut hat.

Siehe die Leitfaden zur Python-Selbstbeobachtung für mehr Informationen.

Die einfachste Methode ist die Verwendung dir(objectname).Es werden alle für dieses Objekt verfügbaren Methoden angezeigt.Cooler Trick.

Um zu überprüfen, ob es eine bestimmte Methode hat:

hasattr(object,"method")

Ich glaube, was Sie wollen, ist ungefähr so:

eine Liste von Attributen eines Objekts

Meiner bescheidenen Meinung nach die eingebaute Funktion dir() kann diesen Job für Sie erledigen.Genommen von help(dir) Ausgabe auf Ihrer Python-Shell:

dir(...)

dir([object]) -> list of strings

Wenn ohne Argument aufgerufen, werden die Namen im aktuellen Bereich zurückgegeben.

Andernfalls wird eine alphabetische Liste von Namen zurückgegeben, die (einige) der Attribute des angegebenen Objekts und der von ihm aus erreichbaren Attribute umfassen.

Wenn das Objekt eine Methode mit dem Namen bereitstellt __dir__, es wird verwendet;Andernfalls wird die Standard -Dir () -Logik verwendet und gibt zurück:

  • für ein Modulobjekt:die Attribute des Moduls.
  • für ein Klassenobjekt:seine Attribute und rekursiv die Attribute seiner Basen.
  • für jedes andere Objekt:Seine Attribute, die Attribute seiner Klasse und rekursiv die Attribute der Basisklassen seiner Klasse.

Zum Beispiel:

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

Als ich Ihr Problem überprüfte, beschloss ich, meinen Gedankengang durch eine bessere Formatierung der Ausgabe von zu demonstrieren 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("")

Ich hoffe, dass ich dazu beigetragen habe :).

Zusätzlich zu den direkteren Antworten wäre es nachlässig, wenn ich es nicht erwähnen würde iPython.Klicken Sie auf die Tabulatortaste, um die verfügbaren Methoden mit automatischer Vervollständigung anzuzeigen.

Und wenn Sie eine Methode gefunden haben, versuchen Sie Folgendes:

help(object.method) 

um die Pydocs, Methodensignatur usw. anzuzeigen.

Ahh... ERSATZ.

Wenn Sie es konkret wünschen Methoden, du solltest benutzen inspect.ismethod.

Für Methodennamen:

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

Zu den Methoden selbst:

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

Manchmal inspect.isroutine kann auch nützlich sein (für integrierte Funktionen, C-Erweiterungen, Cython ohne die Compiler-Direktive „binding“).

Öffnen Sie die Bash-Shell (Strg+Alt+T unter Ubuntu).Starten Sie darin die Python3-Shell.Erstellen Sie ein Objekt, um dessen Methoden zu beobachten.Fügen Sie einfach einen Punkt dahinter ein und drücken Sie zweimal die Tabulatortaste. Sie sehen dann etwa Folgendes:

 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(           

Das Problem bei allen hier genannten Methoden besteht darin, dass Sie NICHT sicher sein können, dass eine Methode nicht existiert.

In Python können Sie den Punkt-Calling-Thru abfangen __getattr__ Und __getattribute__, wodurch es möglich wird, eine Methode „zur Laufzeit“ zu erstellen.

Beispiel:

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

Wenn Sie es ausführen, können Sie eine Methode aufrufen, die nicht im Objektverzeichnis vorhanden ist ...

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

Und deshalb verwenden Sie das Es ist einfacher, um Vergebung zu bitten als um Erlaubnis Paradigmen in Python.

Der einfachste Weg, eine Liste der Methoden eines beliebigen Objekts abzurufen, ist die Verwendung von help() Befehl.

%help(object)

Es werden alle verfügbaren/wichtigen Methoden aufgelistet, die diesem Objekt zugeordnet sind.

Zum Beispiel:

help(str)

Man kann eine erstellen getAttrs Funktion, die die aufrufbaren Eigenschaftsnamen eines Objekts zurückgibt

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

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

Das würde zurückkommen

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

Es gibt keine zuverlässige Möglichkeit, alle Methoden eines Objekts aufzulisten. dir(object) ist normalerweise nützlich, aber in manchen Fällen listet es möglicherweise nicht alle Methoden auf.Entsprechend dir() Dokumentation: „Mit einem Argument, versuchen um eine Liste gültiger Attribute für dieses Objekt zurückzugeben.

Sie können überprüfen, ob eine Methode vorhanden ist callable(getattr(object, method)) wie dort schon erwähnt.

... gibt es zumindest eine einfache Möglichkeit zu überprüfen, ob eine bestimmte Methode vorhanden ist, außer einfach zu prüfen, ob beim Aufruf der Methode ein Fehler auftritt?

Während "Es ist einfacher, um Vergebung zu bitten als um Erlaubnis" ist sicherlich der Pythonic-Weg, nach dem Sie vielleicht suchen:

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

Nehmen Sie eine Liste als Objekt

obj = []

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

Du erhältst:

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

Um in einem ganzen Modul nach einer bestimmten Methode zu suchen

for method in dir(module) :
  if "keyword_of_methode" in method :
   print(method, end="\n")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top