文章目录
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
年龄属性删除。。。