# 这是学习廖雪峰老师python教程的学习笔记

1、概览

@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   # @property:把一个getter方法变成属性

    def score(self):

        return self.__score

 

    @score.setter@score.setter:把一个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

注意:

  1. 上面定义的两个方法 score,在经过@property @score.setter 后,就变成了score属性。

  2. 函数名在这里意义不大,它只是为了转化为属性后方便我们调用。

  3. 通过dir(),对比两个代码的instance,可以很容易看出方法到属性的变化

  4. 用了@property后,不能再随意的给      instance 添加属性了

比如上面的代码。s.name='bart',会报错

 

 

2、例子

1、请利用@property给一个Screen对象加上widthheight属性,以及一个只读属性resolution

# -*- coding: utf-8 -*-

 

class Screen(object):

    @property

    def width(self):

        return __width

    @width.setter

    def width(self,value):

        self.__width=value

   

    @property

    def height(self):

        return __height

    @height.setter

    def height(self,value):

        self.__height=value

   

    @property

    def resolution(self):

        self.__resolution=self.__width * self.__height

        return self.__resolution

 

# 测试:
s = Screen()
s.width = 1024
s.height = 768
print('resolution =', s.resolution)
if s.resolution == 786432:
    print('测试通过!')
else:
    print('测试失败!'
)