Effective Python 读书笔记: 第29条: 用纯属性取代get和set方法

# -*- 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() 

猜你喜欢

转载自blog.csdn.net/qingyuanluofeng/article/details/88932685