Python 定义只读变量@property

1.@property实现只读变量

class Test()def __init__(self, val):
		self.__val= val
	@property
	def onlyReadVal(self):
		return self.__val - 1
f = Test(2)
print(f.onlyReadVal)

运行结果:2

如果添加:

f.onlyReadVal = 3

会报错:

AttributeError: can't set attribute

因为 onlyReadVal 不是普通的属性(定义在init里边),也不是方法,无法进行修改。

2.拓展:@property含义

首先,在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数。
因此,这时不能直接用属性,而是用方法来实现:

class Student(object):

    def get_score(self):
        return self._score

    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

但是,使用@property就能使用属性,并且能检查参数。

class Student(object):

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

因此,对@property只定义getter方法,不定义setter方法就是一个只读属性.

class Student(object):

    @property
    def birth(self):
        return self._birth

    @birth.setter
    def birth(self, value):
        self._birth = value

    @property
    def age(self):
        return 2014 - self._birth

上面的birth是可读写属性,而age就是一个只读属性,因为age可以根据birth和当前时间计算出来。


参考:

  1. 廖雪峰网站 使用@property
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rosefunR

你的赞赏是我创作的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值