类的property用法

property: 在新式类中,将类的方法变成属性,方便调用, 1,对他的get方法,添加@property装饰器, 对他的set方法和del方法要是同名函数的,添加@get方法对应的的函数名.setter, 对于python2 的经典类,只有类的get方法有效

class Student(object):
    @property
    def birth(self):
        print("birth的get方法")
        return self._birth

    @birth.setter
    def birth(self, value):
        print("birth的setter方法")
        self._birth = value
        print(self._birth)

    @birth.deleter
    def birth(self):
        print("birth的deleter方法")
s = Student()
s.birth = 23    # 设置
print(s.birth) # 获取
s.birth=22  # 执行装饰器带有settter的方法
del s.birth   #  # 执行装饰器带有settter的方法


class Foo(object):
    def get_bar(self):
        print('getter......')
        return '老王'
    def set_bar(self,value):
        print('setter........')
        return 'set value'+ value
    def del_bar(self):
        print('deleter........')
        return "删除老王"
    BAR = property(get_bar,set_bar,del_bar,"description......")  #用help(property) 可查看property的各种参数方法

obj = Foo()
print(obj.BAR)
obj.BAR = "alex"   # 自动调用第二个参数中定义的方法,set_bar方法,并将"alex'当做参数传入
desc = Foo.BAR.__doc__         # 自动获取第四个参数中设置的值, description..
del obj.BAR # 自动调用del_bar 方法
输出:
birth的setter方法
23
birth的get方法
23
birth的setter方法
22
birth的deleter方法
getter......
老王
setter........
deleter........

property应用

初始:

class Student(object):
    def get_score(self):
        print('你个网吧打啊')
        return self._score

    def set_score(self, value):
        print('吃啥啊',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

s = Student()
s.set_score(60) # ok!
print(s.get_score())
s.set_score(90)
print(s.get_score())
输出:
吃啥啊 60
你个网吧打啊
60
吃啥啊 90
你个网吧打啊
90

优化:

class Student(object):
    @property
    def score(self):
        return self._score

    @score.setter
    def score(self,value):
        if not isinstance(value, int):
            raise ValueError('分数必须是整数才行呐')
        if value < 0 or value > 100:
            raise ValueError('分数必须0-100之间')
        self._score = value

s = Student()
s.score = 60 # OK,实际转化为s.set_score(60)
print(s.score )# OK,实际转化为s.get_score()
s.score = 98
print(s.score )
输出:
60
98
posted @ 2021-04-16 16:33  ty1539  阅读(107)  评论(0编辑  收藏  举报