Python实用笔记 (23)面向对象高级编程——使用@property

Posted 牛郎

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python实用笔记 (23)面向对象高级编程——使用@property相关的知识,希望对你有一定的参考价值。

这显然不合逻辑。为了限制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

还记得装饰器(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

@property的实现比较复杂,我们先考察如何使用。把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作:

>>> 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!

注意到这个神奇的@property,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。

以上是关于Python实用笔记 (23)面向对象高级编程——使用@property的主要内容,如果未能解决你的问题,请参考以下文章

Python实用笔记 (26)面向对象高级编程——定制类

Python实用笔记 (22)面向对象编程——实例属性和类属性

Python学习笔记八 面向对象高级编程

Python学习笔记八 面向对象高级编程元类

Python面向对象编程高级特性

Python自动化开发课堂笔记Day08 - Python进阶(面向对象的高级用法,网络编程)