472 Stimmen

Wie erhalte ich eine Liste von Methoden in einer Python-Klasse?

3voto

def find_defining_class(obj, meth_name):
    for ty in type(obj).mro():
        if meth_name in ty.__dict__:
            return ty

Also

print find_defining_class(car, 'speedometer') 

Python denken Seite 210

1voto

user3569372 Punkte 39

Ich weiß, dass dies ein alter Beitrag ist, aber ich habe gerade diese Funktion geschrieben und werde sie hier lassen, falls jemand auf der Suche nach einer Antwort darüber stolpert:

def classMethods(the_class,class_only=False,instance_only=False,exclude_internal=True):

    def acceptMethod(tup):
        #internal function that analyzes the tuples returned by getmembers tup[1] is the 
        #actual member object
        is_method = inspect.ismethod(tup[1])
        if is_method:
            bound_to = tup[1].im_self
            internal = tup[1].im_func.func_name[:2] == '__' and tup[1].im_func.func_name[-2:] == '__'
            if internal and exclude_internal:
                include = False
            else:
                include = (bound_to == the_class and not instance_only) or (bound_to == None and not class_only)
        else:
            include = False
        return include
    #uses filter to return results according to internal function and arguments
    return filter(acceptMethod,inspect.getmembers(the_class))

-1voto

Dies ist nur eine Beobachtung. "encode" scheint eine Methode für String-Objekte zu sein

str_1 = 'a'
str_1.encode('utf-8')
>>> b'a'

Wenn str1 jedoch auf Methoden untersucht wird, wird eine leere Liste zurückgegeben

inspect.getmember(str_1, predicate=inspect.ismethod)
>>> []

Vielleicht irre ich mich, aber das Problem scheint nicht einfach zu sein.

-1voto

Um eine Liste von Methoden zu erstellen, setzen Sie den Namen der Methode in eine Liste ohne die üblichen Klammern. Entfernen Sie den Namen und fügen Sie die Klammern hinzu, um die Methode aufzurufen.

    def methodA():
        print("@ MethodA")

    def methodB():
        print("@ methodB")

    a = []
    a.append(methodA)
    a.append(methodB)
    for item in a:
        item()

-2voto

Carson Punkte 3411
class CPerson:
    def __init__(self, age):
        self._age = age

    def run(self):
        pass

    @property
    def age(self): return self._age

    @staticmethod
    def my_static_method(): print("Life is short, you need Python")

    @classmethod
    def say(cls, msg): return msg

test_class = CPerson
# print(dir(test_class))  # list all the fields and methods of your object
print([(name, t) for name, t in test_class.__dict__.items() if type(t).__name__ == 'function' and not name.startswith('__')])
print([(name, t) for name, t in test_class.__dict__.items() if type(t).__name__ != 'function' and not name.startswith('__')])

Ausgabe

[('run', <function CPerson.run at 0x0000000002AD3268>)]
[('age', <property object at 0x0000000002368688>), ('my_static_method', <staticmethod object at 0x0000000002ACBD68>), ('say', <classmethod object at 0x0000000002ACF0B8>)]

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