property属性

在python中使用property属性有两种方法:使用@property装饰器和使用property()函数。(通过廖雪峰官网实例来对此加深认识)

# property装饰器就是负责把一个方法变成属性调用

class Student(object):
    def __init__(self, score=0):
        self._score = score

    @property  # 像访问属性一样访问方法,这个不要写成socre.getter,这点要注意,和下面的get_score是一个意思
    def score(self):
        print("getting score")
        return self._score

    @score.setter  # 在给属性赋值的时候做了验证,注意这三个方法的名称必须一致,和下面的set_score是一个意思
    def score(self, value):
        print("setting score")
        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

    @score.deleter
    def score(self):  # 删除逻辑,这三个方法名称必须是一致,和下面的del_score是一个意思
        del self._score


s = Student(-10)
print(s.score)
print("=====================")
s.score = 88
print(s.score)

 

property()当为函数时,默认有4个参数,分别为:fget,fset,fdel,doc,下面是使用方法

# 使用property函数
class Student(object):
    def __init__(self, score=0):
        self._score = score


    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

    def del_score(self):
        del self._score

    score = property(fget=get_score, fset=set_score, fdel=del_score)  # 如果不使用关键字赋值,注意顺序不要搞错了:fget,fset,fdel,doc
    # 这里的这个名称必须和属性名称一致,否则没办法用属性名来调用


s = Student(-10)
print(s.score) # 自动调用上面的get_socre
print("=====================")
s.score = 88 # 自动调用上面的set_score方法
print(s.score) # 自动调用上面的get_socre方法
del s.score # 自动调用上面的del_score方法

 

总结:

  使用property装饰器和property函数实现的功能是一样的,注意对比着看方便记忆和理解

posted @ 2020-03-19 20:06  海澜时见鲸  阅读(344)  评论(0)    收藏  举报