标签:导致 还需 注意 erro 类的变量 ISE 成绩 如何 comment
如何艺术的调用属性方法?
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:
s = Student()
s.score = 9999 #score属性暴露,能随意修改,可是如何检查呢?
为了限制score的范围,可以通过一个set_score()
方法来设置成绩,再通过一个get_score()
来获取成绩,这样,在set_score()
方法里,就可以检查参数:
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
>>> s = Student()
>>> s.set_score(60) # ok!
>>> s.get_score()
60
>>> s.set_score(9999)
Traceback (most recent call last):
...
ValueError: score must between 0 ~ 100!
----
现在,对任意的Student实例进行操作,就不能随心所欲地设置score了
但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。
有没有既能检查参数,又可以用类似属性这样简单的方式来访问类的变量呢?这是个问题。
还记得装饰器(decorator)可以给函数动态加上功能吗?对于类的方法,装饰器一样起作用。Python内置的@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
>>> s = Student()
>>> s.score = 60 # OK,实际转化为s.set_score(60)
>>> s.score # OK,实际转化为s.get_score()
60
>>> s.score = 9999
Traceback (most recent call last):
...
ValueError: score must between 0 ~ 100!
把一个getter方法变成属性,只需要加上@property
就可以了,此时,@property
本身又创建了另一个装饰器@score.setter
,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作。
注意到这个神奇的@property
,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。
--------------------------------------------------------------
示例演示
既要保护类的封装特性,又要让开发者可以使用“对象.属性”的方式操作操作类属性,通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对“()”小括号。
@property 的语法格式如下:
@property def 方法名(self) 代码块
示例:
class Annimal(): def __init__(self,num): self.__num=num @property def dog(self): return self.__num @dog.setter #可写属性 def dog(self,num): self.__num=num def cat(self): return self.__num rect=Annimal(30) print(rect.dog) #被@property装饰,不需(),类似属性的操作方式 print(rect.cat()) print(rect.cat) #未被@property装饰,这样子调用报错 rect.dog=60 #通过@dog.setter,可重新对dog进行赋值 print(rect.dog)
上面程序中,使用 @property 修饰了 dog() 方法,这样就使得该方法变成了 num 属性的 getter 方法。需要注意的是,如果类中只包含该方法,那么 num 属性将是一个只读属性。
也就是说,在使用 Animal 类时,无法对 num 属性重新赋值。
而要想实现修改 area 属性的值,还需要为 area 属性添加 setter 方法,就需要用到 setter 装饰器,它的语法格式如下:
@方法名.setter def 方法名(self, value): 代码块
这样,num 属性就有了 getter 和 setter 方法,该属性就变成了具有读写功能的属性。
标签:导致 还需 注意 erro 类的变量 ISE 成绩 如何 comment
原文地址:https://www.cnblogs.com/little-sailor/p/13445999.html