有没有办法找到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 ......
答案 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)
很有用。