1、什麼是property屬性
一種用起來像是使用的執行個體屬性一樣的特殊屬性,可以對應于某個方法
# ############# 定義 ##############
class Foo:
def fun(self):
pass
# 定義property屬性,必須傳回一個值
@property
def prop(self):
return 100
# ############# 調用 ################
foo_obj = Foo()
foo_obj.fun() # 調用執行個體方法
print(foo_obj.prop) # 調用屬性
property屬性的定義和調用要注意以下幾點:
- 定義時,在執行個體方法的基礎上添加
裝飾器,并且僅有@property
一個參數self
- 調用時,無需括号
方法: foo_obj.func()
property屬性:foo_obj.prop
2、簡單的執行個體
對于京東商城中顯示電腦主機的清單頁面,每次請求不可能把資料庫中的所有内容都顯示到頁面上,而是通過分頁的功能局部顯示,是以在向資料庫中請求資料時就要顯示的指定擷取從第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)
return val
@property
def end(self):
val = self.current_page * self.per_items
return val
p = Pager(1)
print(p.start) # 就是起始值,即:m
print(p.end) # 就是結束值,即:n
從上述可見:
python的
property
屬性的功能是:property屬性内部進行一系列的邏輯計算,最終将結果傳回
3、property屬性的兩種方式
- 裝飾器 即:在方法上應用裝飾器
- 類屬性 即:在類中定義值為property對象的類屬性
3.1 裝飾器方式
在類的執行個體方法上應用
@property
裝飾器
Python中的類有 經典類 和 新式類 ,新式類 的屬性比 經典類 的屬性豐富。(如果類繼承object,那麼該類是新式類)
經典類,具有一種@property裝飾器
class Goods:
@property
def price(self):
return "laowang"
obj = Goods()
result = obj.price # 自動執行 @property 修飾的price方法,并擷取方法的傳回值
print(result)
新式類,具有三種@property裝飾器
class Goods:
"""
隻有在python3中才有@xxx.setter @xxx.deleter
"""
@property
def price(self):
print("@property")
@price.setter
def price(self, value):
print("@price.setter")
@price.deleter
def price(self):
print("@price.deleter")
obj = Goods()
obj.price # 自動執行 @property 修飾的 price 方法,并擷取方法的傳回值
obj.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):
del self.original_price
obj = Goods()
obj.price = 200 # 修改商品原價
print(obj.price) # 擷取商品價格
del obj.price # 删除商品原價
3.2 類屬性方式,建立值為property對象的類屬性值
- 當使用類屬性的方式床啊進property屬性時, 經典類 和 新式類 無差別
class Foo:
def get_bar(self):
return "lao"
BAR = property(get_bar)
obj = Foo()
result = obj.BAR # 自動調用 get_bar 方法,并擷取方法的傳回值
print(result)
property方法中有四個參數:
- 第一個:方法名,調用 對象.屬性 時自動觸發執行方法
- 第二個:方法名,調用 對象.屬性 = XXX 時自動觸發執行方法
- 第三個:方法名,調用 del 對象.屬性 時自動觸發執行方法
- 第四個:字元串,調用 對象.屬性.__doc__,此參數是該屬性的描述資訊
class Foo(object):
def get_bar(self):
print("getter....")
return 'lao'
def set_bar(self, value):
"""必須兩個參數"""
print("setter....")
return 'set value '+ value
def del_bar(self):
print("deleter....")
return 'lao'
BAR = property(get_bar, set_bar, del_bar, "description...")
obj = Foo()
obj.BAR # 自動調用第一個參數中調用的方法:get_bar
obj.BAR = 'alex' # 自動調用第二個參數中調用的方法:set_bar,并将‘alex’仿做參數傳入
desc = Foo.BAR.__doc__ # 自動擷取第四個參數中設定的值:description...
print(desc)
del obj.BAR
由于 類屬性方式 建立
property
屬性具體有三種通路方式,我們可以根據他們幾個屬性的通路特點,分别将三個方法定義為同一屬性:擷取、修改、删除
3、總結
- 定義
屬性共有兩種方式,分别是【裝飾器】和【類屬性】,而【裝飾器】方式針對經典類和新式類又有所不同property
- 通過使用
屬性,能夠簡化調用者在擷取資料的流程property
4、應用
我們都知道,對于類方法的變量屬于私有變量,是無法進行讀寫的,我們便可以使用
property
的
getter
和
setter
來進行私有變量的讀寫。
4.1 類屬性方式
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:不是整型數字")
# 定義一個屬性,當對這個money設定值時調用setMoney,擷取值時調用getMoney
money = property(getMoney, setMoney)
a = Money()
a.money = 100 # 調用setMoney方法
print(a.money) # 調用getMoney方法
4.2 裝飾器
class Money(object):
def __init__(self):
self.__money = 0
@property
def money(self):
return self.__money
@money.setter
def money(self, value):
if isinstance(value, int):
self.__money = value
else:
print("error:不是整型數字")
a = Money()
a.money = 100
print(a.money)