staticmethod:获取类名?

时间:2012-07-28 20:47:06

标签: 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_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'

对于一个类方法,我可以通过A.my_classmethod.im_self.__name__得到该类的名称,但我无法弄清楚静态方法。

有什么想法吗? 感谢。


嗯,实际上这就是我想做的事情。 我正在尝试使用2个函数来“序列化/反序列化”函数/ classmethod / staticmethod。

这意味着,有人可以将函数传递给serialize函数并获取字符串。

a_string = serialize(A.my_classmethod)

此字符串可以存储在DB中,例如.. 然后,此字符串应足以解析函数以便能够调用它:

# later on...
f = deserialize(a_string)
# I can use my function
f(...)

我可以使它适用于函数或类方法但不适用于静态方法,因为我无法找出它所属的类并使用getattr ......

2 个答案:

答案 0 :(得分:1)

使用“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__

答案 1 :(得分:0)

在回复您关于序列化/反序列化的评论时,您可以更改界面:

def serialize(cls, function):
    return '{cls}.{func}'.format(cls=cls.__name__, func=function.__name__)

您可以将sys.modules[__name__].__name__用于任何模块级函数。

对于反序列化,您可能会发现inspect.classify_class_attrs(cls)很有用。