• python中 @property


    利用两个方法获取score和修改score:

    class Student(object):
        def __init__(self, name, score):
            self.name = name
            self.__score = score
        def get_score(self):
            return self.__score
        def set_score(self, score):
            if score < 0 or score > 100:
                raise ValueError('invalid score')
            self.__score = score

    这样一来,s.set_score(1000) 就会报错。

    这种使用 get/set 方法来封装对一个属性的访问在许多面向对象编程的语言中都很常见。

    但是写 s.get_score()s.set_score() 没有直接写 s.score 来得直接。

    有没有两全其美的方法?----有。

    因为Python支持高阶函数,在函数式编程中我们介绍了装饰器函数,可以用装饰器函数把 get/set 方法“装饰”成属性调用:

    class Student(object):
    
        def __init__(self, name, score):
            self.name = name
            self.__score = score
    
        @property
        def score(self):
            return self.__score
    
        @score.setter
        def score(self, score):
            if score < 0 or score > 100:
                raise ValueError('invalid score')
            self.__score = score
        @property
        def grade(self):
            if self.score>=80:
                return 'A'
            elif self.score<60:
                return 'C'
            else:
                return 'B'
            
    
    s = Student('Bob', 59)
    print s.grade
    
    s.score = 60
    print s.grade

    注意: 第一个score(self)是get方法,用@property装饰,第二个score(self, score)是set方法,用@score.setter装饰,@score.setter是前一个@property装饰后的副产品。

    调用实例属性,可以通过将其封装在类的方法中,然后通过装饰器@property将其装饰器普通属性,表面上就是直接调用属性了。

  • 相关阅读:
    框架基础
    Servlet
    JSP数据交互二
    动态网页开发基础
    数据交互
    期末Java Web大作业----简易的学生管理系统
    南阳71----独木舟上的旅行
    南阳1092----数字分隔(二)
    顺序表、链表、栈和队列
    各类排序模版(计数排序、基数排序、桶排序、冒泡排序、选择排序、插入排序、希尔排序、归并排序、原地归并排序、快速排序、堆排序)
  • 原文地址:https://www.cnblogs.com/WhatTTEver/p/6929642.html
Copyright © 2020-2023  润新知