请检查以下简单代码:
def extract_class_from_func(func_var):
# should return class of the func_var
return ...
class A:
def m(self):
print(self, "m")
func_var = A.m
# This check should succeed
assert A == extract_class_from_func(func_var)
请帮助我实现方法extract_class_from_func
答案 0 :(得分:4)
您不能。在Python 2中,该引用位于A.m.im_class
。但是,引用PEP 3155 - Qualified name for classes and functions:
这种可能性在Python 3中已经消失。
不再有“未绑定方法”之类的东西,并且函数A.m
与常规函数没有什么不同-它不包含对类对象的任何引用。实际上,您甚至可以删除该类并看到“方法”仍然有效:
>>> class Ameta(type):
... def __del__(self):
... print("goodbye A")
...
>>> class A(metaclass=Ameta):
... def m(self):
... print(self, "m")
...
>>> f = A.m
>>> import gc
>>> del A
>>> gc.collect()
goodbye A
6
>>> f("?")
? m
但是,PEP确实为您想要的内容提供了一些有限的支持:如果您查看A.m.__qualname__
,您会发现一个字符串,您可以通过该字符串来反省A
类。
答案 1 :(得分:2)
可以使用func_var.__module__
找到模块,而使用__qualname__
找到类名。然后,您只需执行以下字符串导入操作即可:
import importlib
def extract_class_from_func(func_var):
className = func_var.__qualname__.split('.')[0]
return getattr(importlib.import_module(func_var.__module__), className)
class Greet:
def __init__(self):
pass
def sayHi(self):
print("Hi!")
>>> Greet == extract_class_from_func(Greet.sayHi)
>>> True
答案 2 :(得分:0)
您可以这样做。
def extract_class_from_func(func_var):
return func_var.__qualname__.split('.')[0]