0
点赞
收藏
分享

微信扫一扫

python 描述符 @property装饰器

勇敢乌龟 2023-07-05 阅读 59

'''python 描述符'''
# https://blog.csdn.net/weixin_57289786/article/details/117468662

'''对变量没有要求'''
class student():
    def __init__(self, name, math, chinese):
        self.name = name
        self.math = math
        self.chinese = chinese
    def __repr__(self):
        return "<student: {}, math: {}, english: {}>".format(
            self.name, self.math, self.chinese
        )
ob_student = student(1,2,3)
ob_student

'''math, chinese必须为[0,100]内的实数'''
def real_number_between(num:int= 50, start= 0, end= 100):
    if start<= num <= end:
        return True
    else:
        return False

class student():
    def __init__(self, name, math, chinese):
        self.name = name
        
        if real_number_between(math):
            self.math = math
        else:
            raise ValueError("Valid value must be in [0, 100]")
        
        if real_number_between(chinese):
            self.chinese = chinese
        else:
            raise ValueError("Valid value must be in [0, 100]")
        
    def __repr__(self):
        return "<student: {}, math: {}, english: {}>".format(
            self.name, self.math, self.chinese
        )
ob_student = student(1,2,300)
ob_student

'''@property装饰器 把一个方法变成属性调用'''
# https://www.liaoxuefeng.com/wiki/1016959663602400/1017502538658208
'''Python中@property和@setter的用法'''
# https://www.cnblogs.com/yeer-xuan/p/13488291.html
'''下划线'''
# https://blog.csdn.net/qq_43439853/article/details/99584193
# https://zhuanlan.zhihu.com/p/36173202

class student():
    def __init__(self, name, math, chinese):
        self.name = name
        self.math = math
        self.chinese = chinese
    
    @property
    def math(self):
        return self._math # 允许访问的私有变量
    @math.setter
    def math(self, value):
        if real_number_between(value):
            self._math = value
        else:
            raise ValueError("Valid value must be in [0, 100]")
    
    @property
    def chinese(self):
        return self._chinese
    @chinese.setter
    def chinese(self, value):
        if real_number_between(value):
            self._chinese = value
        else:
            raise ValueError("Valid value must be in [0, 100]")

    def __repr__(self):
        return "<student: {}, math: {}, english: {}>".format(
            self.name, self.math, self.chinese
        )
ob_student = student(1,2,300)
ob_student

'''python 描述符'''
class Score:
    def __init__(self, default=0):
        self._score = default

    def __set__(self, instance, value):
        if not isinstance(value, int):
            raise TypeError('Score must be integer')
        if not 0 <= value <= 100:
            raise ValueError('Valid value must be in [0, 100]')
        self._score = value

    def __get__(self, instance, owner):
        return self._score
 
    def __delete__(self):
        del self._score

        
class Student:
    math = Score(0)
    chinese = Score(0)
    def __init__(self, name, math, chinese):
        self.name = name
        self.math = math
        self.chinese = chinese

    def __repr__(self):
        return "<student: {}, math: {}, english: {}>".format(
            self.name, self.math, self.chinese
        )
ob_student = student(1,2,300)
ob_student

举报

相关推荐

0 条评论