Найти владельца класса метода в Python - PullRequest
0 голосов
/ 28 мая 2018

Я пишу декораторы, и часть того, что мне нужно сделать, это определить, является ли функция функцией или методом.Есть ли способ узнать, к какому классу относится данный метод?

Например, если бы я должен был запустить этот код, что я мог бы написать в getOwner, чтобы exampleFunc напечатать что-то вроде <class '__main__'.Example>?

class Example:
    def method(self):
        print("I'm a method")

def exampleFunc(func):
    owner = getOwner(func)
    print(owner)

test = Example()
exampleFunc(test.method)

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Если у вас есть ссылка на классы, определенные в вашей области видимости, вам нужно проверить для каждого из них:

def exampleFunc(f):
    class_list = [...]
    return any(f in vars(c).values() for c in class_List)

Это вернет True, если функция f является методом экземпляра,Однако, если вы хотите вернуть фактическое имя класса:

def exampleFunc(f):
    class_list = [...]
    for c in class_list:
        if f in vars(c).values():
            return c.__name__

    return 'global function' if 'lambda' not in f.__name__ else 'lambda'

Обратите внимание, что это не работает для __dunder__ методов и методов, которые наследует ваш класс.Например,

class A:
    def f1(self): pass

class B(A):
    def f2(self): pass

print(vars(B)) 
mappingproxy({'__doc__': None,
              '__module__': '__main__',
              'f2': <function __main__.B.f2>})

Обратите внимание, что f1 не является частью B mappingproxy.

0 голосов
/ 28 мая 2018

Если все, что вам нужно сделать, это выяснить, что вещь, которая ведет себя как функция, это метод или функция, это одна из целей модуля types.

import types

def is_method(f):
    return type(f) == types.MethodType

В случае, еслифункциональный объект - это метод, его родительский класс можно найти следующим образом.

Обновление Исправлено для совместимости с Python3.

def method_parent(f):
    return f.__self__
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...