python私有属性和property装饰器_Python 利用@property装饰器和property()方法将一个方法变成属性调用...

在创建实例属性时,如果直接把实例属性暴露出去,虽然写起来简单,但是存在一些风险,比如实例属性可以在外部被修改。

1610045-20200303153947082-1860681745.png

为了限制外部操作,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,在这些方法中还可以增加一些检查操作,比如在get_score中增加获取权限操作,在set_score中增加输入检查操作。

classStudent(object):def __init__(self):

self._score= 60

defget_score(self):print(self._score)returnself._scoredefset_score(self, value):if notisinstance(value, int):raise ValueError('score must be an integer!')if value < 0 or value > 100:raise ValueError('score must between 0 ~ 100!')

self._score=valueif __name__ == "__main__":

s=Student()

s.get_score()

s.set_score("aaa") #语法报错

现在,对任意的Student实例进行操作,就不能随心所欲地设置score了。但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。

有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?对于追求完美的Python程序员来说,这是必须要做到的!

第一种方式,使用Python内置的@property装饰器

@property装饰器就是负责把一个方法变成属性调用的。

@property的实现比较复杂,我们只考虑如何使用。把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了装饰器@score.setter,@score.deleter

装饰器@score.setter负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作。

装饰器@score.deleter负责控制del操作,项目实际中基本不用。

classStudent(object):def __init__(self):

self._score= 60@propertydefscore(self):print(self._score)returnself._score

@score.setter#伴生装饰器,只有设置了 @property 才有setter 和 deleter装饰器

defscore(self, value):if notisinstance(value, int):raise ValueError('score must be an integer!')if value < 0 or value > 100:raise ValueError('score must between 0 ~ 100!')

self._score=valueprint(f"修改score为{self._score}")

@score.deleterdefscore(self):

self._score=0print("删除score")if __name__ == "__main__":

s=Student()

s.score#当获取属性值时执行@property

s.score = 99 #当赋值属性值时执行 @**.setter

del s.score #当删除属性值时执行 @**.deleter

执行结果为:

1610045-20200303160128259-1763455670.png

第二种方式,使用property()创建类属性

第二种方式看起来与使用@property装饰器之前的方式相差不大,唯一不同的是使用了property()方法创建了一个类属性

classStudent(object):def __init__(self):

self._score= 60

defget_score(self):print(self._score)returnself._scoredefset_score(self, value):if notisinstance(value, int):raise ValueError('score must be an integer!')if value < 0 or value > 100:raise ValueError('score must between 0 ~ 100!')

self._score=valueprint(f"修改score为{self._score}")defdel_score(self):

self._score=0print("删除score")

score= property(get_score, set_score, del_score)

if __name__ == "__main__":

s=Student()

s.score#当获取属性值时,执行property()的第一个方法

s.score = 99 #当赋值属性值时,执行property()的第二个方法

del s.score #当删除属性值时执行,执行property()的第三个方法。注意:实际项目中很少用该方法。

总结

python有两种方式可以实现既可以检查参数,又可以用类似于直接访问属性的方式访问对象属性。

第一种:使用Python内置的@property装饰器

第二种:使用property()创建类属性

这两种方法最终实现的效果一样,也没有使用限制,喜欢用哪种就用哪种。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值