Python 中的每 class 个常量

Per-class constants in Python

另一个 Python 代码风格问题。

如果我有一些 "constant values"(引用是因为 Python 中没有这样的东西)适用于单个 class,首选:模块级变量,或者class 个变量?

例如假设我们有一个 class Counter 会在达到恒定阈值时执行某些操作,这是首选?

class Counter(object):
    THRESHOLD = 6
    ...

    def increment(self):
        self.val += 1
        if self.val == Counter.THRESHOLD:
            do_something()

或:

COUNTER_THRESHOLD = 6

class Counter(object):
    ...
    def increment(self):
        self.val += 1
        if self.val == COUNTER_THRESHOLD:
            do_something()

我唯一设法挖掘的是 Python 文档。他们建议将 class 变量理想地视为 "constant":

Class variables can be used as defaults for instance variables, but using mutable values there can lead to unexpected results.

https://docs.python.org/2/reference/compound_stmts.html#class-definitions

然而,这并不能真正回答问题。 编辑:正如@JBernardo 指出的那样,这是无关紧要的,因为它指的是可变数据类型,而不是可变变量值。

想法?

谢谢

绝对保留为class的一员,更清晰整洁

您可以有多个 classes,每个都有一个您不干涉的阈值(更不用说对阈值的全局名称空间引用)。阅读 classname.THRESHOLD 会更清楚,因为它表明了意图的实际含义。

而且,它更适合进口。如果你使用

from file import classname

只有当阈值实际位于 class 的命名空间中时,您才会保留阈值,而在导入特定 classes/functions.

时忽略全局命名空间变量

演示:

Classy.py

glob = "global"

class ClassName:
    name = "Class Name"

Otherfile.py

from classy import ClassName

print ClassName.name
print glob

运行的结果Otherfile.py

Class Name

Traceback (most recent call last):
  File "C:\Users\person\Desktop\otherfile.py", line 4, in <module>
    print glob
NameError: name 'glob' is not defined

如果它只适用于 class,它应该只对 class 可见。