如何从类方法获取类名称?

时间:2020-03-13 03:26:54

标签: python python-3.x

请检查以下简单代码:

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

3 个答案:

答案 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]