property属性
一、什么是property
property是一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法。
# -*- coding: utf-8 -*-
# ############### 定义 ###############
class Foo:
def func(self):
pass
# 定义property属性
@property
def prop(self):
return 100
# ############### 调用 ###############
foo_obj = Foo()
foo_obj.func() # 调用实例方法
foo_obj.prop # 调用property属性
property属性的定义和调用要注意一下几点:
-
定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数
-
调用时,无需括号
方法:foo_obj.func() property属性:foo_obj.prop
注意点:
# -*- coding: utf-8 -*-
class Foo:
def zero(self):
pass
@property
def one(self):
return 100
@property
def two(self, arg):
return 100
if __name__ == '__main__':
fo = Foo()
fo.zero() # 正常
fo.one() # 报错:TypeError: 'int' object is not callable
fo.one # 正常
fo.two # 报错:TypeError: two() missing 1 required positional argument: 'arg'
fo.two(1) # 报错:TypeError: two() missing 1 required positional argument: 'arg'
总结:
一个函数正常情况下需要使用()来调用,而一个函数如果添加了@prpoerty
装饰器,可以不使用()而直接调用。并且这个函数必须为1个参数及self
,如果添加一个参数就会使这个函数破坏,不管咋样都不能调用会一直报错。
二、简单实例
对于csdn的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据 这个分页的功能包括:
- 根据用户请求的当前页和总数据条数计算出 m 和 n
- 根据m 和 n 去数据库中请求数据
# -*- coding: utf-8 -*-
class Pager:
def __init__(self, current_page):
# 用户当前请求的页码(第一页、第二页...)
self.current_page = current_page
# 每页默认显示10条数据
self.per_items = 10
@property
def start(self):
val = (self.current_page - 1) * self.per_items
return val
@property
def end(self):
val = self.current_page * self.per_items
return val
# ############### 调用 ###############
p = Pager(1)
p.start # 就是起始值,即:m
p.end # 就是结束值,即:n
从上述可见
- Python的property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回。
三、property属性的有两种方式
- 装饰器 即:在方法上应用装饰器
- 类属性 即:在类中定义值为property对象的类属性
3.1 装饰器方式
python3中,在类的实例方法上应用@property装饰器。
#coding=utf-8
# ############### 定义 ###############
class Goods:
"""python3中默认继承object类
以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter @xxx.deleter
"""
@property
def price