Python staticmethod:获取类名?

Python staticmethod:获取类名?,python,Python,有没有办法找到staticmethod所属的类的名称 class A(object): @staticmethod def my_staticmethod(): return 'static' @classmethod def my_classmethod(): return 'classmethod' In [2]: A.my_staticmethod Out[2]: <function utils.my_static

有没有办法找到staticmethod所属的类的名称

class A(object):
    @staticmethod
    def my_staticmethod():
        return 'static'

    @classmethod
    def my_classmethod():
        return 'classmethod'


In [2]: A.my_staticmethod
Out[2]: <function utils.my_staticmethod>

In [3]: A.my_classmethod
Out[3]: <bound method type.my_classmethod of <class 'utils.A'>>
In [4]: A.my_classmethod.im_self.__name__
Out[4]: 'A'
例如,此字符串可以存储在数据库中。。 然后,此字符串应足以解析函数,以便能够调用它:

# later on...
f = deserialize(a_string)
# I can use my function
f(...)
我可以让它为函数或类方法工作,但不能为staticmethod工作,因为我无法找出它所属的类并使用getattr…

使用“voodoo”你可以解决它,但说真的-你只是想绕过数据模型-这有什么好处?如果您想要类方法,请使用类方法。如果它们是可以互换的,它们就不会有什么不同了

而且:

@classmethod
def my_classmethod():
    return 'classmethod'
应该是:

@classmethod
def my_classmethod(cls): # assuming no args
    return cls.__name__ # instead of A.my_classmethod.im_self.__name__

为了响应您关于序列化/反序列化的评论,您可以更改接口:

def serialize(cls, function):
    return '{cls}.{func}'.format(cls=cls.__name__, func=function.__name__)
对于任何模块级函数,您都可以使用
sys.modules[\uuuuuuuuu name\uuuuu]。\uuuuuuu name\uuuu


对于反序列化,您可能会发现
inspect.classify\u class\u attrs(cls)
非常有用。

staticmethod的基本要点的可能重复之处在于它与其类没有连接。如果你想知道它在哪个类中,不要使用staticmethod。这里也有重复:@BrenBarn同意。这就像是在你取下车轮后问如何驾驶你的汽车。答案是再把它们放回去。如果你想的话,你可以用
inspect
做一些粗糙的事情,但是可能有一个简单的解决办法,也许一个简单的
hasattr(a,'my_staticmethod')
就是你要找的?实际上,我不知道classmethod会做什么,我没有寻找一个方法来返回类的名称。看看我的第二篇文章,看看我真正的意思。Thx.为了回答你的两个问题:1)为什么这不是你最初的问题=>我想问一个更简单的问题,我只是想问一下我正在经历的障碍,那就是让类名知道一个staticmethod。2) 每个人都告诉你这是个坏主意,尽管黑魔法可以做到,但你觉得这仍然是正确的方法吗?=>我使用的是Django信号,我希望将接收器(不知道它们)连接到信号的DB中,因此我希望能够序列化/反序列化函数(即使是静态方法)。希望它现在有意义。好的,我得出结论,如果不传递类本身,就无法从staticmethod访问类的名称。我首先想要有相同的用例(只传递一个函数),不管函数是什么。那么,我将避免传递staticmethod,并在文档中写入staticmethods不起作用的内容。谢谢
def serialize(cls, function):
    return '{cls}.{func}'.format(cls=cls.__name__, func=function.__name__)