2012-07-28 49 views
1

有没有办法找到staticmethod所属类的名称?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。

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

a_string = serialize(A.my_classmethod) 

此字符串可以存储在数据库例如.. 然后,该字符串应该足以解决函数可以调用它:

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

我可以使它工作对于一个函数或类方法,但不是静态方法,因为我无法弄清它所属的类,并使用getattr ...

+0

可能重复[在python中如何获取其静态方法中的类的名称](http://stackoverflow.com/questions/4691925/in-python-how-to-get-name-of-a- class-inside-its-static-method) – BrenBarn 2012-07-28 20:51:52

+0

基本上静态方法的要点是它与其类没有关系。如果你想知道它在什么类,不要使用静态方法。 – BrenBarn 2012-07-28 20:52:40

+0

这里也重复:http://stackoverflow.com/questions/949259/how-do-i-infer-the-class-to-which-a-staticmethod-belongs – gnr 2012-07-28 20:55:42

回答

0

使用“巫术”,你可以解决它,但认真 - 你只是想绕过数据模型 - 那有什么好处?如果你想要一个类方法 - 使用一个类方法。如果它们的意图是可以互换的,它们就不会有所不同了!

而且也:

@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__ 
+0

实际上,我不知道classmethod会做什么,我没有找到返回类的名字的方法。看看我的第二篇文章,看看我的意思。谢谢。 – Michael 2012-07-28 21:19:13

+0

针对你的两个问题:1)为什么这不是你原来的问题=>我想问一个更简单的问题,只是询问我正在经历的路障,就是让类名知道静态方法。 2)每个人都告诉你这是一个坏主意,虽然可以用黑魔法,但你认为这仍然是正确的做事方式吗? =>我使用的是Django信号,我想在数据库中坚持连接到信号的接收器(不知道它们),因此我希望能够序列化/反序列化函数(即使它是静态方法)。希望现在有意义。 – Michael 2012-07-29 07:40:52

0

在回答您有关序列化/反序列化评论,你可以改变接口:

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

和你可以为任何模块级功能使用sys.modules[__name__].__name__

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

+0

好的,所以我得出结论,没有办法从静态方法访问类的名称,而不通过类本身。无论函数是什么,我都希望拥有相同的用例(仅传递一个函数)。那么,我会避免传递一个静态方法,然后在文档中写入staticmethods不起作用。谢谢。 – Michael 2012-07-29 07:45:26