初識property屬性
說道屬性,我們馬上想到實例屬性、類屬性等
那么回顧一下類屬性
clsas Provice
(
object
)
:
country
=
'china'
def
xxx
(
self
)
:
pass
如上代碼中 country就是類屬性,我們可以通過以下方式去設置值和獲取值
beijing
=
Probice
(
)
# 調用實力方法
beijing
.
xxx
(
)
# 獲取類屬性
my_country
=
beijing
.
country
那么如果我們這個需要在這個country的值需要一些邏輯運算才能得到怎么辦?
python為我們提供了property屬性可以很方便的解決這個問題 如下:
clsas Provice
(
object
)
:
# 定義property屬性
@
property
def
country
(
self
)
:
return
'china'
def
xxx
(
self
)
:
pass
調用:
beijing
=
Probice
(
)
# 調用方法
beijing
.
xxx
(
)
# 調用property屬性
my_country
=
beijing
.
country
由上面的代碼,我們很清楚明白了, 什么是property屬性?
一種用起來像是使用的實例屬性一樣的特殊屬性,可以對應于某個方法
property屬性的定義和調用注意點
- 在實例方法的基礎上添加 @property 裝飾器;并且 僅有一個self參數
- 調用時, 無需括號
實例
分頁操作:
功能包括:
- 根據用戶請求的當前頁和數據條數計算分頁 的start_index和end_index:
- 根據start_index和end_index去數據庫中請求數據
class
Pager
:
def
__init__
(
self
,
current_page
)
:
# 用戶當前請求的頁碼(第一頁、第二頁...)
self
.
current_page
=
current_page
# 每頁默認顯示10條數據
self
.
per_items
=
10
@
property
def
start_index
(
self
)
:
val
=
(
self
.
current_page
-
1
)
*
self
.
per_items
return
val
@
property
def
end_index
(
self
)
:
val
=
self
.
current_page
*
self
.
per_items
return
val
# ############### 調用 ###############
p
=
Pager
(
1
)
p
.
start_index
# 就是起始值,即:m
p
.
end_index
# 就是結束值,即:n
由此,我們得出結論:
Python的property屬性的功能是:property屬性內部進行一系列的邏輯計算,最終將計算結果返回。
property屬性的倆種應用方式
- 裝飾器方式 : 在方法上加裝飾器
- 類屬性 在類中定義值為property對象的類屬性
裝飾器方式
在類的實例方法上應用@property裝飾器
Python中的類有經典類和新式類,新式類的屬性比經典類的屬性豐富。( 如果類繼object,那么該類是新式類 )
經典類,具有一種@property裝飾器:
clsas Provice
(
object
)
:
# 定義property屬性
@
property
def
country
(
self
)
:
return
'china'
新式類,具有三種@property裝飾器:
clsas Provice
(
object
)
:
''' python3中默認繼承object類 以python2、3執行此程序的結果不同,因為只有在python3中才有@xxx.setter @xxx.deleter '''
def
__init__
(
self
)
:
self
.
country
=
'china'
@
property
def
country
(
self
)
:
return
self
.
country
.
upper
(
)
@country
.
setter
def
country
(
self
,
value
)
:
# 必須倆個參數
self
.
country
=
value
@country
.
deleter
def
country
(
self
)
:
del
self
.
country
調用方式
beijing
=
Provice
(
)
beijing
.
country
# 自動執行 @property 修飾的 country方法,并獲取方法的返回值'
beijing
,
country
=
'china'
# 自動執行 @country.setter 修飾的 country方法,并將 china 賦值給方法的參數
del
beijing
.
country
# 自動執行 @country.deleter 修飾的 country方法
類屬性方式
當使用類屬性的方式創建property屬性時,經典類和新式類無區別
clsas Provice
(
object
)
:
''' python3中默認繼承object類 以python2、3執行此程序的結果不同,因為只有在python3中才有@xxx.setter @xxx.deleter '''
def
__init__
(
self
)
:
self
.
country
=
'china'
def
get_country
(
self
)
:
return
self
.
country
.
upper
(
)
def
set_country
(
self
,
value
)
:
# 必須倆個參數
self
.
country
=
value
def
del_country
(
self
)
:
del
self
.
country
country
=
property
(
get_country
,
set_country
,
del_country
,
'descroption...'
)
# 調用
beijing
=
Provice
(
)
beijing
.
country
# 獲取 - 自動調用第一個參數中定義的方法:get_country
beijing
.
country
=
"china"
# 修改 - 自動調用第二個參數中定義的方法:set_country方法,并將'china'當作參數傳入
desc
=
beijing
.
country
.
__doc__
# 自動獲取第四個參數中設置的值:description...
print
(
desc
)
del
beijing
.
country
# 刪除 - 自動調用第三個參數中定義的方法:del_country方法
property方法中四個參數詳解 :
- 第一個參數是方法名,調用 對象.屬性 時自動觸發執行方法
- 第二個參數是方法名,調用 對象.屬性 = XXX 時自動觸發執行方法
- 第三個參數是方法名,調用 del 對象.屬性 時自動觸發執行方法
- 第四個參數是字符串,調用 對象.屬性__doc__ ,此參數是該屬性的描述信息
總結
- 定義property屬性共有兩種方式,分別是【裝飾器】和【類屬性】,而【裝飾器】方式針對經典類和新式類又有所不同。
- 通過使用property屬性,能夠簡化調用者在獲取數據的流程
應用
如果我們學過java 就知道私有屬性 set() 和 get() 方法。 如下java代碼:
class
Student
{
// 聲明私有屬性name
private
String name
;
/** name 的set方法,對name值做非空判斷 */
public
void
setName
(
String name
)
{
if
(
null
!=
name
&&
name
.
length
>
0
)
{
this
.
name
=
name
;
}
else
{
print
(
"name值不能為空"
)
}
}
public
void
getName
(
)
{
return
this
.
name
;
}
}
// 調用
Student s1
=
new
Srudent
(
)
;
// 創建實例對象
s1
.
setName
(
'張三'
)
;
// 設置name
name
=
s1
.
getName
(
)
// 獲取name
那么我們也仿照上面java實現的方式來實現一個python的setter和getter方法
class
Student
(
object
)
:
def
__init__
(
self
)
:
# 創建私有屬性__name
self
.
__name
=
''
def
getName
(
self
)
:
return
self
.
__name
def
setName
(
self
,
name
)
:
if
None
!=
name
and
len
(
name
)
>
0
:
self
.
__name
=
name
else
:
print
(
"name值不能為空"
)
# 調用
s1
=
Student
(
)
//
創建實例
s1
.
setName
(
'張三'
)
//
設置名稱
name
=
s1
.
getName
(
)
//
獲取名稱
python實現后,我們發現通過property 可以作進一步優化
class
Student
(
object
)
:
def
__init__
(
self
)
:
# 創建私有屬性__name
self
.
__name
=
''
def
getName
(
self
)
:
return
self
.
__name
def
setName
(
self
,
name
)
:
if
None
!=
name
and
len
(
name
)
>
0
:
self
.
__name
=
name
else
:
print
(
"name值不能為空"
)
NAME
=
property
(
getName
,
setName
)
# 調用
s1
=
Student
(
)
# 創建實例
s1
.
NAME
=
'張三'
# 設置name
name
=
s1
.
NAME
# 獲取name
用裝飾器實現property的方式
class
Student
(
object
)
:
def
__init__
(
self
)
:
# 創建私有屬性__name
self
.
__name
=
''
# 使用裝飾器對name進行裝飾,那么會自動添加一個叫name的屬性,當調用獲取name的值時,調用裝飾的方法
@
property
def
name
(
self
)
:
return
self
.
__name
# 使用裝飾器對name進行裝飾,當對name設置值時,調用裝飾的方法
@name
.
setter
def
name
(
self
,
name
)
:
if
None
!=
name
and
len
(
name
)
>
0
:
self
.
__name
=
name
else
:
print
(
"name值不能為空"
)
NAME
=
property
(
getName
,
setName
)
# 調用
s1
=
Student
(
)
# 創建實例
s1
.
NAME
=
'張三'
# 設置name
name
=
s1
.
NAME
# 獲取name
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
