codecamp

Python 特性 (property) 规范 | Google 官方用法

特性 (properties)

(译者注:参照 fluent python。这里将 “property” 译为“特性”,而 “attribute” 译为属性。python 中数据的属性和处理数据的方法统称“属性(arrtibute)”,而在不改变类接口的前提下用来修改数据属性的存取方法我们称为“特性property)”。)

Tip

可以用特性来读取或设置涉及简单计算、逻辑的属性。特性的实现必须和属性 (attribute) 一样满足这些通用要求:轻量、直白、明确。

定义:

把读取、设置属性的函数包装为常规属性操作的写法。

优点:

  1. 可以直接实现属性的访问、赋值接口, 而不必添加获取器getter)和设置器setter)。
  2. 可以让属性变为只读。
  3. 可以实现惰性求值。
  4. 类的内部实现发生变化时,可以用这种方法让用户看到的公开接口保持不变。

缺点:

  1. 可能掩盖副作用,类似运算符重载operator overload)。
  2. 子类继承时可能产生困惑。

结论:

允许使用特性。但是,和运算符重载一样,只能在必要时使用,并且要模仿常规属性的存取特点。若无法满足要求,请参考 获取器和写入器 的规则。  举个例子,一个特性不能仅仅用于获取和设置一个内部属性:因为不涉及计算,没有必要用特性(应该把该属性设为公有)。而用特性来限制属性的访问或者计算 简单 的衍生值则是正确的:这种逻辑简单明了。
应该用 @property 装饰器 (decorator)来创建特性。自行实现的特性装饰器属于威力过大的功能。
特性的继承机制难以理解。不要用特性实现子类能覆写 (override) 或扩展的计算功能。

Python 默认参数值规范 | Google 官方避坑指南
Python True/False 求值规范 | Google 官方写法
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }