湖南建设资质申请网站/深圳外贸seo
慕斯王
没有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功能