@staticmethod for simple class methods suggested
我最近用Pycharm和Sonarkube来检查我的代码。这两个工具都建议更新很多方法,比如get_success_url,这些方法在其主体中不使用self来使用@staticmethod修饰器。
我完全理解为什么,但我觉得这几乎毫无意义。在性能方面,我不确定这是否有帮助。此外,这些通常被重写的django方法。我能安全地使用这个装饰器吗?或者它是如此毫无意义,不值得花时间更新?
- 就我个人而言,我认为这可能是唯一一次检查,因为我也这样认为。
- 您要覆盖的方法确实使用了self—您不是在调用基本实现吗?为什么不呢?
- 如果我有像def get_success_url(): return reverse_lazy('admin_team_list')这样的东西怎么办?(是的,我知道我可以直接用success_url = ...指明)
- 使用静态方法的一个好处是,它告诉代码的读者您实际上已经考虑了设计,并且没有使用self,因为它不是必需的,而不是意外遗漏的,或者打算在子类中引入的。我想静态方法在运行时会稍微高效一点,因为它们不需要引用实例(timeit也同意我的观点),而且在安全方面,如果不使用self,那么切换就不会是问题。
- Pycharm建议将方法更改为静态的原因的可能副本
- 还有,Python中的静态方法?
- 不完全是,我没有问为什么,但它是否值得。我猜@jonsharpe绝对是对的。如果你把它写下来,我会把你的回答当作是接受的。
在性能方面,一个简单的例子表明,调用静态方法比调用实例方法(这是您所期望的,因为它不需要传递实例引用)效率稍高:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| >>> class Test(object):
def method(self):
pass
@staticmethod
def static_method():
pass
>>> import timeit
>>> setup = 'from __main__ import Test;t = Test()'
>>> timeit.timeit('t.method()', setup=setup)
0.1694500121891134
>>> timeit.timeit('t.static_method()', setup=setup)
0.14622945482461702 |
在安全性方面,考虑到您的方法实际上并没有引用实例(或被重写的方法实现),切换到@staticmethod将没有任何区别。
在可读性方面,它告诉查看您的代码的人,您实际上已经考虑了设计,并且self不是故意在主体中使用的,不是偶然使用的。
- 我理解您关于staticmethod的观点,它表明您已经考虑了设计,但我认为这可能会使代码在以后变得更加混乱。以get_success_url为例。现在可能不需要self,但是如果我想在以后把它改成使用self.request,该怎么办?如果我看到staticmethod修饰器,我不知道该方法是否必须是静态方法(例如,调用MyModel.get_success_url()的东西),或者它只是一个静态方法,因为它不使用self。
- @alasdair这是一个很好的观点;静态(和类)方法可以在类或实例上调用,而实例方法只能在实例上调用。但是你在哪里画出雅格尼的线呢?