面向对象高级特性之----property类属性

1.定义

  • 将类方法转化为类属性,使代码更简洁,转化为类属性后,调用时不用加(),直接调用
  • 定义时,在实例方法的基础上添加@property装饰器,仅有一个self参数

2.应用场景

(1)某个属性,只对它进行查看访问,不能修改,将类方法转化为类属性

class Date(object):
    def __init__(self,year,month,day):
        self.__year=year   #定义为私有属性
        self.__month=month
        self.__day=day
    @property    #将私有属性定义为一个方法,添加property装饰器后,只能查看不能修改
    def year(self):
        return self.__year
    @property
    def month(self):
        return self.__month
    @property
    def day(self):
        return self.__day

if __name__ == '__main__':
    dateobj=Date(2020,1,12)
    print(dateobj.year,dateobj.month,dateobj.day) #虽然year,month,day都是类方法,但是由于使用了装饰器property将类方法转化为了类属性,因此调用时不用加()

结果

2020 1 12  #原来年月日定义的是私有属性,在函数外部是无法访问的,通过property装饰器,可以查看但不能修改

(2)某个属性不能直接返回,需要计算,可以通过property属性实现(不能一步实现,直接定义为属性)

goods=['电脑'+str(i) for i in range(100)]
class Pagintor(object):
    #实现商品分页的类
    def __init__(self,object_list,page=1,per_page=5):
        """

        @param object_list:商品列表
        @param page: 当前页码
        @param per_page: 每页显示的数据个数
        """
        self.object_list=object_list
        self.page=page
        self.per_page=per_page
    @property
    def start(self):
        return (self.page-1)*self.per_page
    @property
    def end(self):
        return (self.page)*self.per_page
    @property
    def total(self):
        """
        @return:数据总条数
        """
        return len(self.object_list)
    @property
    def pages(self):
        """

        @return:商品总页数
        """
        result=self.total//self.per_page
        if self.total%self.per_page==0:
            return result
        else:
            return result+1
    @property
    def hasNext(self):
        return True if 0<self.page+1<self.pages else False
    @property
    def hasPrevious(self):
        return True if 0<self.page-1<self.pages else False
    @property
    def previous(self):
        pre_page=self.page-1
        pre_start=(pre_page-1)*self.per_page
        pre_end=pre_page*self.per_page
        return self.object_list[pre_start:pre_end]
    @property
    def next(self):
        next_page=self.page+1
        next_start=(next_page-1)*self.per_page
        next_end=next_page*self.per_page
        return self.object_list[next_start:next_end]
    @property
    def current_items(self):
        return self.object_list[self.start:self.end]
pagintor=Pagintor(object_list=goods,page=3,per_page=5)
print('第三页的商品信息为:',goods[pagintor.start:pagintor.end])
print('是否有上一页?',pagintor.hasPrevious)
print('上一页的信息为:',pagintor.previous)
print('总页数是:',pagintor.pages)
print('当前页信息为:',pagintor.current_items)
print('下一页的信息为:',pagintor.next)

结果

第三页的商品信息为: ['电脑10', '电脑11', '电脑12', '电脑13', '电脑14']
是否有上一页? True
上一页的信息为: ['电脑5', '电脑6', '电脑7', '电脑8', '电脑9']
总页数是: 20
当前页信息为: ['电脑10', '电脑11', '电脑12', '电脑13', '电脑14']
下一页的信息为: ['电脑15', '电脑16', '电脑17', '电脑18', '电脑19']

3.实现类属性的方式

(1)通过函数的方式实现类属性

class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.__age=age
    @property
    def is_age_valid(self):
        return 0<self.__age<120
    #设置property对象(age)的属性
    def get_age(self):
        if self.is_age_valid:
            return self.__age
        else:
            raise Exception('年龄不合法')
    def set_age(self,age):
        if 0<age<120:
            return self.__age
        else:
            raise Exception('年龄不合法!')
    def del_age(self):
        print('年龄属性删除。。。')
    #通过函数的方式实现property类属性
    age=property(fget=get_age,fset=set_age,fdel=del_age)
if __name__ == '__main__':
    person=Person('张三',18)
    print(person.age)
    person.__age=20  #修改年龄
    print(person.__age)
    del person.age

结果

18
20
年龄属性删除。。。

(2) 通过装饰器的方式实现属性

class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.__age=age
    @property
    def is_age_valid(self):
        return 0<self.__age<120
    @property
    def age(self):
        if self.is_age_valid:
            return self.__age
        else:
            raise Exception('年龄不合法')
    @age.setter
    def age(self,age):
        if 0<age<120:
            return self.__age  #必须重新判断,不能使用原来的,否则只会执行上一个判断
        else:
            raise Exception('年龄不合法!')
    @age.deleter
    def age(self):
        print('年龄属性删除。。。')
    #通过函数的方式实现property类属性
    #age=property(fget=get_age,fset=set_age,fdel=del_age)
if __name__ == '__main__':
    person=Person('张三',18)
    print(person.age)
    person.__age=20  #修改年龄
    print(person.__age)
    del person.age

结果

18
20
年龄属性删除。。。
发布了36 篇原创文章 · 获赞 0 · 访问量 288

猜你喜欢

转载自blog.csdn.net/ANingL/article/details/103931705
今日推荐