652 Stimmen

Herausfinden, welche Methoden ein Python-Objekt hat

Gibt es bei einem beliebigen Python-Objekt eine einfache Möglichkeit, die Liste aller Methoden zu erhalten, die dieses Objekt hat?

Oder,

wenn dies nicht möglich ist, gibt es zumindest eine einfache Möglichkeit zu überprüfen, ob es eine bestimmte Methode hat, außer einfach zu überprüfen, ob ein Fehler auftritt, wenn die Methode aufgerufen wird?

0 Stimmen

10voto

Cld Punkte 451

Das Problem bei allen hier genannten Methoden ist, dass Sie kann nicht sicher sein, dass eine Methode nicht existiert.

In Python können Sie den Punktaufruf abfangen durch __getattr__ y __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 nicht vorhandene Methoden im Objektverzeichnis aufrufen...

>>> 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 die Es ist einfacher, um Vergebung zu bitten als um Erlaubnis Paradigmen in Python.

4voto

aver Punkte 109

Es gibt keine zuverlässige Möglichkeit, alle Methoden eines Objekts aufzulisten. dir(object) ist in der Regel nützlich, aber in manchen Fällen werden nicht alle Methoden aufgeführt. Gemäß dir() Dokumentation : "Mit einem Argument, Versuch um eine Liste der gültigen Attribute für dieses Objekt zurückzugeben."

Das Vorhandensein der Methode kann wie folgt überprüft werden callable(getattr(object, method)) wie dort bereits erwähnt.

3voto

The Mob Punkte 241
import moduleName
for x in dir(moduleName):
    print(x)

Das sollte funktionieren :)

2voto

revliscano Punkte 2175

Ich habe die folgende Funktion ausgeführt ( get_object_functions ), der ein Objekt empfängt ( object_ ) als sein Argument, und gibt eine Liste ( functions ) mit allen Methoden (einschließlich statischer und Klassenmethoden), die in der Klasse des Objekts definiert sind :

def get_object_functions(object_):
    functions = [attr_name
                 for attr_name in dir(object_)
                 if str(type(getattr(object_,
                                     attr_name))) in ("<class 'function'>",
                                                      "<class 'method'>")]
    return functions

Nun, es wird lediglich geprüft, ob die String-Darstellung des Typs eines Klassenattributs gleich ist "<class 'function'>" o "<class 'method'>" und nimmt dieses Attribut dann in die functions Liste, wenn das True .


Demo

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def introduce(self):
        print(f'My name is {self.name}')

    @staticmethod
    def say_hi():
        print('hi')

    @classmethod
    def reproduce(cls, name):
        return cls(name, 0)

person = Person('Rafael', 27)
print(get_object_functions(person))

出力

['__init__', 'introduce', 'reproduce', 'say_hi']

Für eine sauberere Version des Codes: https://github.com/revliscano/utilities/blob/master/get_object_functions/object_functions_getter.py

1voto

james_womack Punkte 9740

Man kann eine getAttrs Funktion, die die Namen der aufrufbaren Eigenschaften 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 wieder

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X