有没有办法将staticmethod应用于给定类的所有方法。
我以为我们可以访问其元类中的方法(在元类的 new 中)并应用staticmethod,但我不知道语法。任何人都可以对此有所了解吗?
答案 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
之后实际上是一个类实例,这可能会误导您,具体取决于您使用它的方式。