一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法
# -----定义-----
class Foo:
def func(self):
pass
@property
def prop(self):
pass
# -----调用-----
foo_obj = Foo()
foo_obj.func() # 调用实例方法
foo_obj.prop # 调用property属性
class Goods:
# -----定义-----
@property
def price(self)
return 100
goods = Goods()
# -----调用-----
price = goods.price
print(price)
property属性的定义和调用要注意一下几点:
@property
装饰器;并且仅有一个self
参数对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据 这个分页的功能包括:
根据用户请求的当前页和总数据条数计算出 m 和 n
根据m 和 n 去数据库中请求数据
# ############### 定义 ###############
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
retrun val
@property
def end(self):
val = self.current_page * self.per_items
return val
# ############### 调用 ###############
p = Pager(1)
m = p.start # 就是起始值,即m
n = p.end # 就是结束值,即n
从上述可见: * Python的property属性的功能是:property属性内部进行一系列的逻辑运算,最终将结果返回。
装饰器
:即在方法上应用装饰器
类属性
:即在类中定义值为property对象的类属性
在类的实例方法上应用@property
装饰器
Python中的类有经典类
和新式类
,新式类
的属性比经典类
的属性丰富。(只要类继承自object,那么这个类就是新式类)
经典类,具有一种@property装饰器
# ############### 定义 ###############
class Goods:
@property
def price(self):
return 100
# ############### 调用 ###############
goods = Goods()
price = goods.price # 自动执行@property修饰的price方法,并获取方法的返回值
print(result)
新式类,具有三种@property装饰器
# ############### 定义 ###############
class Goods(object):
@property
def price(self):
print('@property')
@price.setter
def price(self):
print("@price.setter")
@price.deleter
def price(self):
print('@price.deleter')
# ############### 调用 ###############
goods = Goods()
goods.price # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
godds.price = 123 # 自动执行 @price.setter 修饰的 price 方法,并将 123 赋值给方法的参数
del obj.price # 自动执行 @price.deleter 修饰的 price 方法
总结:
经典类中的属性只有一种访问方式,其对应被@property修饰的方法
新式类中的属性有三种访问方式,分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法
由于新式类中具有三种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除
class Goods(object):
def __init__(self):
# 原价
self.original_price = 100
# 折扣
self.discount = 0.8
@property
def price(self):
new_price = self.original_price * self.discount
return new_price
@price.setter
def price(self, value):
self.original_price = value
@price.deleter
def price(self):
delf self.original_price
goods = Goods()
goods.price # 获取商品价格
goods.price = 200 # 修改商品原价
del goods.price # 删除商品原价
创建值为property对象的类属性,当使用类属性的方式创建property属性时,经典类和新式类无区别
class Foo:
def get_bar(self):
return 'august rush'
BAR = property(get_bar)
obj = Foo()
result = obj.BAR # 自动调用 get_bar方法,并获取方法的返回值
print(result)
property方法中有四个参数
第一个参数是方法名,调用 对象.属性
时自动触发执行方法
第二个参数是方法名,调用 对象.属性 = xxx
时自动触发执行方法
第三个参数是方法名,调用 del 对象.属性
时自动触发执行方法
第四个参数是字符串,调用 对象.属性.__doc__
此参数是该属性的描述信息
class Foo:
def get_bar(self):
print('getter...')
return 'get_bar() is processing'
def set_bar(self, value):
print('setter...')
return 'set value ' + value
def del_bar(self):
print('deleter')
return 'del_bar() is processing'
BAR = property(get_bar, set_bar, del_bar, "description...")
foo = Foo()
foo.BAR # 自动调用第一个参数中定义的方法:get_bar
foo.BAR = 'alex' # 自动调用第二个参数中定义的方法,并将“alex”当作参数传入
desc = Foo.BAR.__doc__ # 自动获取第四个参数中设置的值:description...
del obj.BAR # 自动调用第三个参数中定义的方法:del_bar方法
class Goods:
def __init__(self):
self.original_price = 100
self.discount = 0.8
def get_price(self):
tag_price = self.original_price * self.discount
return tag_price
def set_price(self, price):
self.original_price = price
def del_price(self):
self.original_price = 0
price = property(get_price, set_price, del_price, "some description...")
goods = Goods()
print(goods.price)
goods.price = 200
print(goods.original_price)
print(goods.price)
del goods.price
print(goods.price)
1. 私有属性添加getter和setter方法
class Money(object):
def __init__(self):
self.__money = 0
def getMoney(self):
return self.__money
def setMoney(self, value):
if isinstance(value, int):
self.__money = value
else:
print("error:不是整型数字")
2. 使用类属性方式
class Money(object):
def __init__(self):
self.__money = 0
def getMoney(self):
return self.__money
def setMoney(self, value):
if isinstance(value, int):
self.__money = value
else:
print("error:不是整型数字")
# 定义一个属性,当对这个属性设置值时调用setMoney,当获取值时调用getMoney
money = property(getMoney, setMoney)
a = Money()
a.money = 100 # 调用setMoney方法
print(a.money) # 调用getMoney方法
3. 使用装饰器方式
class Money:
def __init__(self):
self.__money = 100
@property
def money(self):
return self.__money
@money.setter
def money(self, value):
if isinstance(value, int):
self.__money = value
else:
print('必须是int类型')
m = Money()
print(m.money)
m.money = 200
print(m.money)
基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建