Python中的每类常量

时间:2015-07-28 14:20:11

标签: python coding-style

另一个Python代码样式问题。

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

E.g。假设我们有一个类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文档。他们认为类变量理想地被视为“常数”:

  

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

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

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

思想?

由于

2 个答案:

答案 0 :(得分:6)

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

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

但是,它对进口来说要好得多。如果你使用

from file import classname

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

演示:

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

答案 1 :(得分:2)

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