作者:关注了🐴
Github:Github
掘金:进去看看🐴
爱好:Americano More Ice !
QQ学习交流群(new): 811792998
面向对象高级编程-@property 当你在那个shi’yo绑定属性时,当把属性暴露出去,但没办法检查参数时。。 话不多说,直接上菜!
为什么需要@property
看个最简单的例子,你懂
s = Student()
s.height = 90
我们可以优化一下,做下检验
class Student(object):
def get_height(self):
return self._height
def set_height(self, value):
if not isinstance(value, int):
raise ValueError('score must be an integer!')
if value < 0 or value > 250:
raise ValueError('score must between 0 ~ 250!')
self._score = value
写完调用看下效果
>>> s = Student()
>>> s.get_height(170)
>>> s.get_height()
170
>>> s.set_height(9999)
Traceback (most recent call last):
...
ValueError: score must between 0 ~ 250!
有没有发现了,虽然实现了参数校验但稍许复杂呢!
当我们用上@property,有点爽
class Student(object):
@property
def height(self):
return self._height
@height.setter
def height(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 ~ 250!')
self._score = value
再调用试试看~
>>> s = Student()
>>> s.height = 170
>>> s.height
170
>>> s.height = 9999
Traceback (most recent call last):
...
ValueError: score must between 0 ~ 250!
@property 在对实例属性操作的时候,是通过getter和setter方法来实现的,所以可以定义只读属性(只定义getter的方法)
基于上面的例子,我们加工一下~
class Student(object):
@property
def height(self):
return self._height
@height.setter
def height(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 ~ 250!')
self._score = value
@property
def weight(self):
return self._weight
特别注意 :属性的方法名 不可与 实例变量 重名!! 原因:因为调用s.birth 时,首先转换为方法调用,在执行return self.birth 时,又视为访问self 的属性,于是又转换为方法调用,造成无限递归,最终导致栈溢出报错RecursionError
结束语:如果遇到什么疑问或者建议的,可直接留言评论!作者看到会马上一一回复
如果觉得小白此文章不错或对你有所帮助,期待你的一键三连💫!?? ni ~
|