是否有任何方法可以将staticmethod应用于给定类的所有方法。
我想我们可以访问它的元类中的方法(在元类的new中)并应用静态方法,但我不知道语法。有人能解释一下吗?
如果没有一个方法共享任何状态,那么根本没有理由拥有一个类。一个有功能的模块可能是一个更好的想法。。。
虽然模块(如mgilson所建议的)是一个更好的选择,但如果真的对此有很好的用途(我想不出),那么使用inspect
模块和类装饰器就相对容易了:
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
,而不是这样做(例如,因为这会破坏编辑器的检查)。给出这个答案是为了表明这是可能的,因为这是一个非常简单的实现。
mgilson的答案是最好的,但要添加另一种通常用于将类定义为命名空间的模式,您还可以实例化类,覆盖类名:
class Test:
def a_static_method(self, arg1, srg2):
pass
Test = Test()
不过,请注意,在此之后,Test
实际上是一个类实例,根据您的使用方式,这可能会产生误导