我需要:
问题是,我怎样才能可靠地从课程中获取课程?我已尝试在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)
答案 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'>
但是,如果类是在函数中创建的(因此是本地的),或者类是通过类装饰器替换的,或者只是在全局命名空间中重命名,那么上述技巧最好不会起作用,最糟糕的是给你一个完全不同的对象,你不知道是不是这样。