2

有没有办法找到静态方法所属的类的名称?

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 个函数来“序列化/反序列化”一个函数/类方法/静态方法。

这意味着,有人可以将一个函数传递给序列化函数并获取一个字符串。

a_string = serialize(A.my_classmethod)

例如,这个字符串可以存储在数据库中。然后,这个字符串应该足以解析函数以便能够调用它:

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

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

4

2 回答 2

1

使用“巫毒”你可以解决它,但说真的 - 你只是想规避数据模型 - 那有什么好处?如果你想要一个类方法 - 使用一个类方法。如果它们是可以互换的,它们就不会不同!

并且:

@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__
于 2012-07-28T21:06:06.653 回答
0

针对您对序列化/反序列化的评论,您可以更改接口:

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

您可以sys.modules[__name__].__name__用于任何模块级功能。

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

于 2012-07-28T22:16:35.740 回答