如何在没有实例的情况下检查方法?

时间:2016-01-05 14:09:52

标签: python

我需要:

  • 接收方法作为参数(直接来自类,没有实例)
  • 创建实例
  • 从实例
  • 执行所述方法

问题是,我怎样才能可靠地从课程中获取课程?我已尝试在inspect模块中研究某些内容,但由于没有实例,因此将该方法视为function而不是method

以下是我正在尝试做的一些例子:

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)

1 个答案:

答案 0 :(得分:3)

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

cls = method.im_class

对于未绑定方法,在Python 3中,你将会运气不好(函数返回完全没有变化,没有引用该类)。 Python 2返回一个未绑定的方法类型,其中仍然存在im_class属性:

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

在Python 3中,您的选项更加有限并且容易出错。您可以查看函数的__qualname__属性,并从中推断出可能在全局命名空间中绑定的类:

>>> class Foo:
...     def bar(self): pass
...
>>> Foo.bar
<function Foo.bar at 0x10e97b268>
>>> Foo.bar.__qualname__
'Foo.bar'
>>> Foo.bar.__qualname__.rpartition('.')[0]
'Foo'
>>> Foo.bar.__globals__.get(Foo.bar.__qualname__.rpartition('.')[0])
<class '__main__.Foo'>

但是,如果类是在函数中创建的(因此是本地的),或者类是通过类装饰器替换的,或者只是在全局命名空间中重命名,那么上述技巧最好不会起作用,最糟糕的是给你一个完全不同的对象,你不知道是不是这样。