Python 如何检查没有实例的方法?

Python 如何检查没有实例的方法?,python,Python,我需要: 接收方法作为参数(直接从类接收,不带实例) 创建一个实例 从实例执行所述方法 问题是,我如何才能可靠地将类从方法中取出?我试着在inspect模块中研究一些东西,但是因为没有实例,它认为该方法是函数,而不是方法 下面是我正在尝试做的一些示例: def execute_method(method): cls = get_class_from_method(method) obj = cls() getattr(obj, method.__name__)()

我需要:

  • 接收方法作为参数(直接从类接收,不带实例)
  • 创建一个实例
  • 从实例执行所述方法
问题是,我如何才能可靠地将类从方法中取出?我试着在
inspect
模块中研究一些东西,但是因为没有实例,它认为该方法是
函数
,而不是
方法

下面是我正在尝试做的一些示例:

def execute_method(method):
    cls = get_class_from_method(method)
    obj = cls()
    getattr(obj, method.__name__)()


def get_class_from_method(method):
    pass # how?


execute_method(HelloView.say_hello)

Python 2方法对象有一个
im_class
属性,该属性引用它们绑定到的实例的类:

cls = method.im_class
对于一个未绑定的方法,在Python3中,您将运气不佳(函数返回时完全没有更改,没有对类的引用)。Python 2返回一个未绑定的方法类型,其
im\u class
属性仍然存在:

>>> class Foo(object):
...     def bar(self): pass
...
>>> Foo.bar.im_class
<class '__main__.Foo'>

但是,如果该类是在函数中创建的(因此是本地的),或者该类是通过类装饰器替换的,或者只是在全局名称空间中重命名的,那么上述技巧充其量不会起作用,最坏的情况下会给您一个完全不同的对象,您不知道是否是这种情况。

Python 2方法对象有一个
im\u class
属性,该属性引用它们绑定到的实例的类:

cls = method.im_class
对于一个未绑定的方法,在Python3中,您将运气不佳(函数返回时完全没有更改,没有对类的引用)。Python 2返回一个未绑定的方法类型,其
im\u class
属性仍然存在:

>>> class Foo(object):
...     def bar(self): pass
...
>>> Foo.bar.im_class
<class '__main__.Foo'>

但是,如果该类是在函数中创建的(因此是本地的),或者该类是通过类装饰器替换的,或者只是在全局名称空间中重命名的,那么上述技巧充其量不会起作用,最坏的情况下会给您一个完全不同的对象,你不知道情况是否如此。

这不是一个绑定方法。@hugo_leonardo:更新为实际工作,对此很抱歉。哦。好啊(:~不过我希望Python3有办法。@hugo_leonardo:没有。你可以尝试解释
\uuuu qualname\uuuu
属性,并在相同的全局中搜索父类。但这并不能保证有效,因为该类可能是在本地命名空间中创建的,或者被包装在类装饰器或其他WI中se不再以该名称的全局形式出现。我想你是对的。刚刚发现这是一个重复的问题:它不是绑定方法。@hugo_leonardo:更新为实际工作,对此表示抱歉。哦,好的(:~不过我希望Python3有办法。@hugo_leonardo:没有。你可以尝试解释
\uuuu qualname\uuuu
属性,并在相同的全局中搜索父类。但这并不能保证有效,因为该类可能是在本地命名空间中创建的,或者被包装在类装饰器或其他WI中se不再以该名称的全局名称出现。我想你是对的。刚刚发现这是一个重复的问题: