使用@property

为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数:

class Student():

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

创建实例

b=Student()

b.set_score(89)

print(b.get_score())


通过装饰器,可以既能检查参数,又可以用类似属性这样简单的方式来访问类的变量。内置的@property装饰器就是负责把一个方法变成属性调用的:

class Student():

@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方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:

s=Student()

s.score=90  #实际转化为s.set_score(60)

print(s.score)


@property  还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性:

class Student():

@property

    def birth(self):

return self._birth

@birth.setter

    def birth(self,value):

self._birth=value

@property

    def age(self):

return 2015-self._birth

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

练习:定义Screen类并设置width和height属性

class Screen():

@property

    def width(self):

return self._width

@property

    def height(self):

return self._height

@width.setter

    def width(self,value):

self._width=value

@height.setter

    def height(self,value):

self._height=value

@property

    def resolution(self):

return self._height *self._width

w=Screen()

w.width=8

w.height=9

print(w.height)

print(w.resolution)


©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:s = S...
    牛崽儿酷阅读 1,794评论 0 0
  • 使用@property:(首先,这个一般是放在类里边,其次这个放在类内函数之上) 既能检查参数(就是通过get()...
    黄大臻Dzreal阅读 1,521评论 0 0
  • 如果需要设置一个参数,并且需要检验,那么就可以使用函数来检验比如:class student:get_score(...
    晓函阅读 1,768评论 0 0
  • 转载自:使用@property 使用@property 在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单...
    lucasdada阅读 864评论 1 0
  • 基础1.r''表示''内部的字符串默认不转义2.'''...'''表示多行内容3. 布尔值:True、False(...
    neo已经被使用阅读 5,709评论 0 5