有没有办法在 Python 中声明一个常量?在 Java 中,我们可以用这种方式创建常量值:
public static final String CONST_NAME = "Name";
Python 中上述 Java 常量声明的等价物是什么?
在其他语言中没有const
关键字,但是可以创建一个具有 “getter 函数”来读取数据的 Property,但是没有 “setter 函数”来重写数据。 这实质上保护标识符不被更改。
以下是使用 class 属性的替代实现:
请注意,对于想知道常量的读者而言,代码并不容易。见下面的解释
def constant(f):
def fset(self, value):
raise TypeError
def fget(self):
return f()
return property(fget, fset)
class _Const(object):
@constant
def FOO():
return 0xBAADFACE
@constant
def BAR():
return 0xDEADBEEF
CONST = _Const()
print CONST.FOO
##3131964110
CONST.FOO = 0
##Traceback (most recent call last):
## ...
## CONST.FOO = 0
##TypeError: None
代码说明:
constant
,并使用它来构造一个 “getter” - 一个只返回表达式值的函数。 constant
函数作为装饰来快速定义只读属性。 而在其他一些更老式的方式:
(代码非常棘手,下面有更多解释)
class _Const(object):
@apply
def FOO():
def fset(self, value):
raise TypeError
def fget(self):
return 0xBAADFACE
return property(**locals())
CONST = _Const()
print CONST.FOO
##3131964110
CONST.FOO = 0
##Traceback (most recent call last):
## ...
## CONST.FOO = 0
##TypeError: None
请注意,@ apply 装饰器似乎已被弃用。
property
函数构造一个可以 “设置” 或 “获取” 的对象。 property
函数的前两个参数名为fset
和fget
。 property
函数在 Python 而不是语言强制实施的东西中,人们使用命名约定,例如__method
用于私有方法,并使用_method
用于受保护的方法。
因此,以同样的方式,您可以简单地将常量声明为全部大写,例如
MY_CONSTANT = "one"
如果你想要这个常量永远不会改变,你可以挂钩属性访问并做一些技巧,但更简单的方法是声明一个函数
def MY_CONSTANT():
return "one"
只有问题无处不在,你必须做 MY_CONSTANT(),但是再次MY_CONSTANT = "one"
是 python 中的正确方法(通常)。
您还可以使用namedtuple来创建常量:
>>> from collections import namedtuple
>>> Constants = namedtuple('Constants', ['pi', 'e'])
>>> constants = Constants(3.14, 2.718)
>>> constants.pi
3.14
>>> constants.pi = 3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: can't set attribute