【问题标题】:Python: are static variables discouraged?Python:不鼓励使用静态变量吗?
【发布时间】:2017-08-13 11:54:59
【问题描述】:

我正在阅读有关静态变量(即类变量)、静态方法、类方法以及所有这些的细微差别的内容。在 C++ 等语言中,static variables are generally strongly discouraged because of many IMO compelling reasons。我只是好奇,如果 Python 社区对不鼓励使用静态变量有一个已知的立场。 The Google Python Style Guide does not seem to have a pro/con position on static variables.

在 Python 语言中,是否不鼓励使用静态变量(即代码味道不好)?

Google C++ 风格指南的声明“[静态变量] 导致难以发现的错误”似乎不仅适用于 C++ 语言,也适用于 Python 语言。

【问题讨论】:

  • 该链接讨论具有静态存储持续时间的类类型变量,而不是静态变量。这包括全局变量和 static 标记的本地变量。
  • 这可能太基于意见了。但我认为一般来说,虽然肯定有有效的用例,但您通常需要一个实例属性。
  • 在 Python 中指定的初始化顺序比在 C++ 中要精确得多。虽然它仍然有些不确定,但您通常可以确保不会发生 C++ 问题,只要您没有循环导入。

标签: python static static-methods static-variables


【解决方案1】:

在某些语言中,例如 Java,静态变量可能会导致可测试性问题,因为它们不容易被模拟出来。在 Python 中情况并非如此。

但是,静态变量和类变量的好处较少,因为当您拥有不需要访问特定实例成员的值或函数时,您可以在模块级别定义它们,并在不使用它们的情况下使用它们对类的引用——Java 等语言所没有的奢侈品。

所以我想说static 本身并不是代码异味。但是如果你的变量中有一半是static,那么我会问一些关于你对OO设计的理解的问题。

【讨论】:

  • 我正在写一个大的分层树。如何避免树的根成为静态变量?将根作为 s 参数传递给每个节点构造函数?获取模块级别/全局变量?
  • 我不明白你的问题——我看不出任何超类需要变量的理由。作为对我的回答的评论,您的问题在这里几乎没有可见性。也许把你的评论变成一个真正的问题,然后发布。
  • 我发布了这个问题。stackoverflow.com/questions/63690024/…
  • 很抱歉没有引起太多关注。有时会发生。
【解决方案2】:

您正在阅读的 C++ 资源正在讨论具有 static storage duration 的类类型变量。这些与静态变量不同。例如,以下变量也有静态存储时长:

Example x;

namespace whatever {
    Example y;
}

void foo() {
    static Example z;
}

这些在 C++ 中是危险的,因为它们被初始化和销毁​​的顺序是不可预测且容易出错的。


Python 没有静态存储持续时间的变量。它甚至根本没有存储期限。它具有(模块)全局和静态变量,但它们的初始化顺序比 C++ 中定义的要精确得多。除非您有循环导入,否则不太可能发生 C++ 问题,即使那样,问题也是循环导入,而不是全局或静态变量。


也就是说,可变的全局状态,例如您在程序过程中改变的全局变量或静态变量,对language-independent reasons 不利。这与 C++ 的静态存储持续时间问题完全不同。您不打算改变的全局变量和静态变量通常没问题。

【讨论】:

  • 非常有见地的帖子。您的帖子(也称为摘要)的两个关键要点:1. Python 没有“静态存储持续时间”和“初始化顺序比 C++ 中更精确地定义”,因此完全禁止使用静态不需要 Python 中的变量。 2. 正如您指出的generally speaking mutable global state is bad(您的链接真的真的写得很好)。我在原来的帖子中有点暗示那方面,但你描述问题的方式写得更好。
  • 这个问题几乎感觉应该发布在softwareengineering.stackexchange.com上。但必须重写以更通用。
猜你喜欢
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 2015-02-03
  • 1970-01-01
相关资源
最近更新 更多