没有const关键字与其他语言一样,但是可以创建以下属性具有“getter函数”读取数据,但是无“设定函数”重写数据。这在本质上保护标识符不被更改。
下面是使用类属性的替代实现:
请注意,对于想知道常量的读者来说,这段代码并不容易。见下文解释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 0xDEADBEEFCONST = _Const()print CONST.FOO##3131964110CONST.FOO = 0##Traceback (most recent call last):##
...## CONST.FOO = 0##TypeError: None
代码说明:定义函数
constant它接受一个表达式,并使用它构造一个“getter”-一个只返回表达式值的函数。
setter函数引发TypeError,因此它是只读的。
使用
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##3131964110CONST.FOO = 0##Traceback (most recent call last):##
...## CONST.FOO = 0##TypeError: None
请注意,@Apply装饰符似乎被废弃了。要定义标识符foo,Firs定义两个函数(fset,fget-名称由我选择)。
然后使用内置的
property函数来构造一个可以“设置”或“获取”的对象。
注意
property函数的前两个参数被命名为
fset和
fget.
使用以下事实:我们为自己的getter&setter选择了这些名称,并使用应用于该作用域的所有本地定义的*(双星号)创建关键字字典,将参数传递给
property功能