Translate-CS 板


LINE

※ [本文转录自 Python 看板 #1HYIhEj7 ] 作者: sandwichC (没回应=挂站) 看板: Python 标题: [翻译] Google 建议的 Python 风格指南 13 时间: Wed May 8 00:24:43 2013 欢迎大家插队翻译,像 t 大那篇就写得很棒 有时候翻译的过程发现一些以前没注意的小细节也蛮有趣的 这次的内容是用 property 读写 class 内的变数 对 property 不熟的可以搭配 python doc 阅读: http://docs.python.org/2/library/functions.html#property -------正文开始的分隔线------- 原文网址:http://google-styleguide.googlecode.com/svn/trunk/pyguide.html 属性 (property) 若需要读写类别内的变数时,使用 属性 (property) 来取代直接的存取及 getter/setter 式的存取。 释义: 它是 getter/setter 的一个包装 (wrapper)。使用 a.x 时,虽然看起来像是直接 读写,但实际上是透过类似於 a.setX(val) 或 a.getX() 的方式来读写,当计算 量不大时适用。 优点: 不需要使用 getter 及 setter,故可读性增加。计算采用延迟求值的方式 (lazy calculation)。这是 python 在写 class 时的惯用法 (编案:较旧版本的 python 不支援此方法)。有时候直接读写类别内的变数是合理的,这时使用 getter/setter 的方法显得繁琐。若使用属性则可绕过这个问题,未来也可以在不破坏呼叫方式的 情况下加上读写的方法 (method)。 缺点: 使用上,property 宣告的地方在 getter 与 setter 方法之後,因此往往得看到 後面的程式片段才知道前面的方法被用来当作属性。例外:唯读的属性在被创建 的时候就有 @property 的装饰 (decorator) 了,最後有例子。(编案:较新的 python 多了 setter 和 deleter 的 decorator,所以这已经不是缺点了。) 必须继承自 object 类别。可能隐藏像是运算子重载这类的副作用。继承时易造 成困惑。 决策: 在新的程式中用 property 来取代直接读写或 getter/setter 式的读写。唯读的 property 在创建时加上 @property 装饰。 (编案:较新的版本的 python 可直接用 @property, @x.setter, @x.deleter 来取代 x = property(getx, setx, delx, "docstring contents")) 继承时,若子类别没覆载 (override) property,则继承关系很模糊。 因此,应确认读写的方法被间接地呼叫,以确保子类别中被重载的方法有被 property 呼叫。(使用 template method 设计模式) (编案:若子类别连 property 一起覆载,则不一定需要用 template method 设 计模式间接呼叫读写的方法。) Yes: import math class Square(object): """A square with two properties: a writable area and a read-only perimeter. To use: >>> sq = Square(3) >>> sq.area 9 >>> sq.perimeter 12 >>> sq.area = 16 >>> sq.side 4 >>> sq.perimeter 16 """ def __init__(self, side): self.side = side def __get_area(self): """Calculates the 'area' property.""" return self.side ** 2 def ___get_area(self): """Indirect accessor for 'area' property.""" return self.__get_area() def __set_area(self, area): """Sets the 'area' property.""" self.side = math.sqrt(area) def ___set_area(self, area): """Indirect setter for 'area' property.""" self.__set_area(area) area = property(___get_area, ___set_area, doc="""Gets or sets the area of the square.""") @property def perimeter(self): return self.side * 4 编案:以下的例子可以帮助理解为何有子类别时要使用间接呼叫 (1) 不使用间接呼叫 class Foo(object): def _get_var(self): return 10 var = property(_get_var) class Bar(Foo): def _get_var(self): return 20 bar = Bar() print bar.var 输出:10 (2) 使用间接呼叫 class Foo(object): def _get_var(self): return 10 def __get_var(self): return self._get_var() var = property(__get_var) class Bar(Foo): def _get_var(self): return 20 bar = Bar() print bar.var 输出:20 (3) 子函式也用 property class Foo(object): def _get_var(self): return 10 var = property(_get_var) class Bar(Foo): def _get_var(self): return 20 var = property(_get_var) bar = Bar() print bar.var 输出:20 --



※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 75.102.68.185



※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: sandwichC (75.102.68.185), 时间: 05/08/2013 00:26:24







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP