有没有办法将staticmethod应用于所有类方法?

时间:2013-02-15 16:19:31

标签: python static-methods

有没有办法将staticmethod应用于给定类的所有方法。

我以为我们可以访问其元类中的方法(在元类的 new 中)并应用staticmethod,但我不知道语法。任何人都可以对此有所了解吗?

3 个答案:

答案 0 :(得分:4)

如果这些方法都没有共享任何状态,那么根本没有理由让一个类完成任务。具有功能的模块可能是一个更好的主意......

答案 1 :(得分:2)

虽然a module (as suggested by mgilson)是一个更好的选择,但如果真的对此有很好的用处(我想不出一个),那么the inspect module和{{3}}相对容易一个类装饰器:

import inspect

def staticmethods(cls):
    for name, method in inspect.getmembers(cls, inspect.ismethod):
        setattr(cls, name, staticmethod(method.__func__))
    return cls

@staticmethods
class Test:
    def test():
        print("Test")

Test.test()

所有类装饰器都使用inspect.getmembers()遍历对象上的方法,然后使用原始(未绑定)函数的staticmethod()覆盖该函数。

请注意,我会在类上使用一个模块,并且可能只是手动调用每个函数上的@staticmethod而不是这样做(例如,这会破坏我的编辑器的检查)。这个答案是为了表明它是可能的,因为它是一个非常简单的实现。

答案 2 :(得分:1)

mgilson's answer是最好的,但是要添加另一个通常用于将类定义为命名空间的模式,您还可以实例化该类,覆盖类名:

class Test:
    def a_static_method(self, arg1, srg2):
        pass

Test = Test()

请注意,在此Test之后实际上是一个类实例,这可能会误导您,具体取决于您使用它的方式。