另一个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指出的那样,这是无关紧要的,因为它指的是可变数据类型,而不是可变变量值。
思想?
由于
答案 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)
如果它仅适用于该类,则它应仅对该类可见。