# -*- encoding: utf-8 -*-
import os
'''
第29条: 用纯属性取代get和set方法
关键:
1 @property修饰器和
作用: 等同于getXXX()方法,返回某个属性
缺点: 和属性相关的方法只能在子类中共享,其他无关类,则无法复用
2 @xxx.setter
作用: 等同于setXXX(self, value)设置某个属性的值
样例:
@property
def voltage(self):
return self._voltage
@voltage.setter
def voltage(self, voltage):
self._voltage = voltage
self.current = self._voltage / self.ohms
4 总结
编写类的时候尽量用public属性代替set和get方法,
访问属性用@property
参考:
Effectiv Python 编写高质量Python代码的59个有效方法
'''
class Resistor(object):
def __init__(self, ohms):
self.ohms = ohms
self.voltage = 0
self.current = 0
class VoltageResistance(Resistor):
def __init__(self, ohms):
super(VoltageResistance, self).__init__(ohms)
self._voltage = 0
@property
def voltage(self):
return self._voltage
@voltage.setter
def voltage(self, voltage):
self._voltage = voltage
self.current = self._voltage / self.ohms
class BoundedResistance(Resistor):
def __init__(self, ohms):
super(BoundedResistance, self).__init__(ohms)
@property
def ohms(self):
return self._ohms
@ohms.setter
def ohms(self, ohms):
if ohms <= 0:
raise ValueError('%f ohms must be > 0' % ohms)
self._ohms = ohms
def use():
r2 = VoltageResistance(1e3)
print "Before: {value}".format(
value=r2.current
)
r2.voltage = 10
print "After: {value}".format(
value=r2.current
)
r3 = BoundedResistance(1e3)
r3.ohms = 1
def process():
use()
if __name__ == "__main__":
process()
Effective Python 读书笔记: 第29条: 用纯属性取代get和set方法
猜你喜欢
转载自blog.csdn.net/qingyuanluofeng/article/details/88932685
今日推荐
周排行