Python中的每类常量

Edd*_*ett 4 python coding-style

另一个Python代码样式问题.

如果我有一些"常量值"(引用因为Python中没有这样的东西)适用于单个类,那么首选:模块级变量还是类变量?

例如假设我们有一个类Counter在达到恒定阈值时做某事,这是首选的?

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

    def increment(self):
        self.val += 1
        if self.val == Counter.THRESHOLD:
            do_something()
Run Code Online (Sandbox Code Playgroud)

要么:

COUNTER_THRESHOLD = 6

class Counter(object):
    ...
    def increment(self):
        self.val += 1
        if self.val == COUNTER_THRESHOLD:
            do_something()
Run Code Online (Sandbox Code Playgroud)

我设法挖掘出来的唯一一件事就是来自Python文档.他们建议将类变量理想地视为"常量":

类变量可以用作实例变量的默认值,但使用可变值可能会导致意外结果.

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

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

思考?

谢谢

Sup*_*Man 7

绝对保持它作为班级成员,它更清晰,更整洁.

您可以拥有多个类,每个类都具有您不会干扰的阈值(更不用说对阈值的全局命名空间引用).读起来要清楚得多,classname.THRESHOLD因为它表明了意图的实际意义.

但是,进口也好得多.如果你使用

from file import classname
Run Code Online (Sandbox Code Playgroud)

如果它实际上在类的命名空间中,您将只保留阈值,而在导入特定的类/函数时,将忽略全局命名空间变量.

展示:

Classy.py

glob = "global"

class ClassName:
    name = "Class Name"
Run Code Online (Sandbox Code Playgroud)

Otherfile.py

from classy import ClassName

print ClassName.name
print glob
Run Code Online (Sandbox Code Playgroud)

运行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
Run Code Online (Sandbox Code Playgroud)


Bry*_*ley 5

如果它仅适用于该类,则它应该仅对该类可见。