【问题标题】:@staticmethod for simple class methods suggested@staticmethod 建议使用简单的类方法
【发布时间】:2016-01-07 04:59:40
【问题描述】:

我最近使用 pycharm 和 sonarqube 来检查我的代码。这两个工具都建议更新很多方法,例如get_success_url,它们在它们的主体中没有使用self,以使用@staticmethod 装饰器。

我完全理解为什么,但我觉得这几乎毫无意义。关于性能,我不确定它是否会有帮助。此外,这些通常是被覆盖的 django 方法。我可以安全地使用那个装饰器吗,或者它没有意义,不值得花时间去更新?

【问题讨论】:

  • 我个人认为这可能是我唯一禁用的检查,因为我也有这种感觉。
  • methods you're overriding 使用self - 你不是调用基本实现吗?为什么不呢?
  • 如果我有类似def get_success_url(): return reverse_lazy('admin_team_list') 的东西怎么办? (是的,我知道我可以直接用success_url = ... 指定
  • 使用静态方法的一个好处是它告诉代码的读者您实际上已经考虑过设计,并且没有使用self,因为它不是必需的,而是而不是意外错过,或者打算在子类中引入。我猜静态方法在运行时会稍微高效一些,因为它们不需要引用实例(timeit 同意我的观点),并且如果你不使用 self 那么就安全而言切换不会有问题。

标签: python django


【解决方案1】:
  • 在性能方面,一个简单的例子表明调用静态方法比调用实例方法效率稍高(这是您所期望的,因为它不必传递实例引用):

    >>> 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 说得好;静态(和类)方法可以在类或实例上调用,而实例方法只能在实例上调用。但是你与 YAGNI 的界限在哪里?
猜你喜欢
  • 1970-01-01
  • 2018-01-10
  • 2010-12-23
  • 1970-01-01
  • 2017-10-19
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
相关资源
最近更新 更多