如何在Python中创建常量?
有没有办法在Python中声明一个常量? 在Java中,我们可以用这种方式创建常量值:
public static final String CONST_NAME = "Name";
Python中的上述Java常量声明等价于什么?
不,那里没有。 您不能在Python中将变量或值声明为常量。 只是不要改变它。
如果你在一个班级,相当于:
class Foo(object):
CONST_NAME = "Name"
如果没有,这是公正的
CONST_NAME = "Name"
但你可能想看看由Alex Martelli编写的Python中的代码段常量。
在其他语言中没有const
关键字,但可以创建一个具有“getter函数”来读取数据的属性,但不能使用“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
链接地址: http://www.djcxy.com/p/6991.html