【问题标题】:Python static or not staticPython 静态或非静态
【发布时间】:2017-02-23 18:18:36
【问题描述】:

我最近开始使用 PyCharm,只要我的方法之一可以是静态的(只要我不使用任何成员),它就会告诉我。

我想知道尽可能将方法设为静态是否是一种好习惯。我知道这在其他(编译)语言中是一个坏习惯,但感觉对于 Python 来说它实际上会更轻松。通常,PyCharm 建议的此类更正由 PEP 编号支持,但此编号没有。

TL;DR 即使我不需要静态使用它们,我是否应该将我的方法声明为静态?

【问题讨论】:

  • 我建议在做出此决定时更多地关注概念模型而不是代码。一个操作在概念上是特定于单个对象实例(即使不需要像当前实现的那样与该实例交互),还是对您正在使用的类所代表的对象类型的通用操作?或者,该操作是否对可能无法访问您的类实例的代码有用?将此来自 PyCharm 的消息视为提醒您考虑您的概念模型,而不是对特定结果的建议。
  • 这似乎是一个偏好问题。至少对我来说。
  • ...顺便说一句,“其他(编译)语言的坏习惯”是...我不同意这是绝对正确的。
  • @Dschoni 我在发帖前看过这篇文章。它更多的是关于我们“可以”做的事情,而不是“应该”做的事情。

标签: python static-methods pep


【解决方案1】:

一个方法,一个类的函数属性,如果它不可能使用第一个参数,一个类的实例,它可以被声明为静态的。使用未使用的参数/错误定义函数通常是一个坏主意。如果缺少使用是一个错误,因为应该使用参数,那么应该修复它。如果缺少使用不是bug,那么(一般情况下),应该从header中删除参数。

PyCharm 还应该建议,如果不使用不是错误,则从类中删除函数并从定义中删除未使用的 self 参数,以便可以在不需要不相关的类实例的情况下调用它。 Python 不是 Java。 Python 使用模块而不是类作为默认函数容器。示例:

def C:
    def fmeth(self, x):

def ffunc(x):
    return x * 3 + 2

print(C().fmeth(0), ffunc(0)

除了在某些特殊情况下,要求通过 C 实例访问函数并没有任何好处。

Python 标准库几乎不使用staticmethod()。除了测试,大概只有20个左右的用途,我查的可以看成特例。 Guido van Rossum 曾表示,将staticmethodclassmethod 一起添加是有问题的,不应过多使用。

【讨论】:

  • 哦,太好了,谢谢。我在模块方面考虑得不够多。我将把它移到课堂之外,然后避免导入它。
猜你喜欢
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2014-02-26
  • 2014-01-22
  • 1970-01-01
相关资源
最近更新 更多