溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

通過實例了解python property屬性

發(fā)布時間:2020-10-13 06:18:01 來源:腳本之家 閱讀:120 作者:張風閑 欄目:開發(fā)技術(shù)

這篇文章主要介紹了通過實例了解python property屬性,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1. 什么是property屬性

一種用起來像是使用的實例屬性一樣的特殊屬性,可以對應于某個方法

# ############### 定義 ###############
class Foo:
  def func(self):
    pass

  # 定義property屬性
  @property
  def prop(self):
    pass

# ############### 調(diào)用 ###############
foo_obj = Foo()
foo_obj.func() # 調(diào)用實例方法
foo_obj.prop # 調(diào)用property屬性

如下的例子用于說明如何定一個簡單的property屬性:

class Goods(object):
    @property
    def size(self):
        return 100 
g = Goods()
print(g.size)

property屬性的定義和調(diào)用要注意一下幾點:

  • 定義時,在實例方法的基礎上添加 @property 裝飾器;并且僅有一個self參數(shù)
  • 調(diào)用時,無需括號

2. 簡單的實例

對于京東商城中顯示電腦主機的列表頁面,每次請求不可能把數(shù)據(jù)庫中的所有內(nèi)容都顯示到頁面上,而是通過分頁的功能局部顯示,所以在向數(shù)據(jù)庫中請求數(shù)據(jù)時就要顯示的指定獲取從第m條到第n條的所有數(shù)據(jù) 這個分頁的功能包括:

  • 根據(jù)用戶請求的當前頁和總數(shù)據(jù)條數(shù)計算出 m 和 n
  • 根據(jù)m 和 n 去數(shù)據(jù)庫中請求數(shù)據(jù)
# ############### 定義 ###############
class Pager:
  def __init__(self, current_page):
    # 用戶當前請求的頁碼(第一頁、第二頁...)
    self.current_page = current_page
    # 每頁默認顯示10條數(shù)據(jù)
    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

# ############### 調(diào)用 ###############
p = Pager(1)
p.start # 就是起始值,即:m
p.end # 就是結(jié)束值,即:n

從上述可見:

Python的property屬性的功能是:property屬性內(nèi)部進行一系列的邏輯計算,最終將計算結(jié)果返回。

3. property屬性的有兩種方式

  • 裝飾器 即:在方法上應用裝飾器
  • 類屬性 即:在類中定義值為property對象的類屬性

3.1 裝飾器方式

在類的實例方法上應用@property裝飾器

Python中的類有經(jīng)典類和新式類,新式類的屬性比經(jīng)典類的屬性豐富。( 如果類繼object,那么該類是新式類 )

經(jīng)典類,具有一種@property裝飾器:

# ############### 定義 ###############  
class Goods:
  @property
  def price(self):
    return "laowang"
# ############### 調(diào)用 ###############
obj = Goods()
result = obj.price # 自動執(zhí)行 @property 修飾的 price 方法,并獲取方法的返回值
print(result)

新式類,具有三種@property裝飾器:

#coding=utf-8
# ############### 定義 ###############
class Goods:
  """python3中默認繼承object類
    以python2、3執(zhí)行此程序的結(jié)果不同,因為只有在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')

# ############### 調(diào)用 ###############
obj = Goods()
obj.price     # 自動執(zhí)行 @property 修飾的 price 方法,并獲取方法的返回值
obj.price = 123  # 自動執(zhí)行 @price.setter 修飾的 price 方法,并將 123 賦值給方法的參數(shù)
del obj.price   # 自動執(zhí)行 @price.deleter 修飾的 price 方法

注意:

  • 經(jīng)典類中的屬性只有一種訪問方式,其對應被 @property 修飾的方法
  • 新式類中的屬性有三種訪問方式,并分別對應了三個被@property、@方法名.setter、@方法名.deleter修飾的方法

由于新式類中具有三種訪問方式,我們可以根據(jù)它們幾個屬性的訪問特點,分別將三個方法定義為對同一個屬性:獲取、修改、刪除

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     # 獲取商品價格
obj.price = 200  # 修改商品原價
del obj.price   # 刪除商品原價

3.2 類屬性方式,創(chuàng)建值為property對象的類屬性

當使用類屬性的方式創(chuàng)建property屬性時,經(jīng)典類和新式類無區(qū)別

class Foo:
  def get_bar(self):
    return 'laowang'

  BAR = property(get_bar)

obj = Foo()
reuslt = obj.BAR # 自動調(diào)用get_bar方法,并獲取方法的返回值
print(reuslt)

property方法中有個四個參數(shù)

  • 第一個參數(shù)是方法名,調(diào)用 對象.屬性 時自動觸發(fā)執(zhí)行方法
  • 第二個參數(shù)是方法名,調(diào)用 對象.屬性 = XXX 時自動觸發(fā)執(zhí)行方法
  • 第三個參數(shù)是方法名,調(diào)用 del 對象.屬性 時自動觸發(fā)執(zhí)行方法
  • 第四個參數(shù)是字符串,調(diào)用 對象.屬性.__doc__ ,此參數(shù)是該屬性的描述信息
#coding=utf-8
class Foo(object):
  def get_bar(self):
    print("getter...")
    return 'laowang'

  def set_bar(self, value): 
    """必須兩個參數(shù)"""
    print("setter...")
    return 'set value' + value

  def del_bar(self):
    print("deleter...")
    return 'laowang'

  BAR = property(get_bar, set_bar, del_bar, "description...")

obj = Foo()

obj.BAR # 自動調(diào)用第一個參數(shù)中定義的方法:get_bar
obj.BAR = "alex" # 自動調(diào)用第二個參數(shù)中定義的方法:set_bar方法,并將“alex”當作參數(shù)傳入
desc = Foo.BAR.__doc__ # 自動獲取第四個參數(shù)中設置的值:description...
print(desc)
del obj.BAR # 自動調(diào)用第三個參數(shù)中定義的方法:del_bar方法

由于類屬性方式創(chuàng)建property屬性具有3種訪問方式,我們可以根據(jù)它們幾個屬性的訪問特點,分別將三個方法定義為對同一個屬性:獲取、修改、刪除

class Goods(object):

  def __init__(self):
    # 原價
    self.original_price = 100
    # 折扣
    self.discount = 0.8

  def get_price(self):
    # 實際價格 = 原價 * 折扣
    new_price = self.original_price * self.discount
    return new_price

  def set_price(self, value):
    self.original_price = value

  def del_price(self):
    del self.original_price

  PRICE = property(get_price, set_price, del_price, '價格屬性描述...')

obj = Goods()
obj.PRICE     # 獲取商品價格
obj.PRICE = 200  # 修改商品原價
del obj.PRICE   # 刪除商品原價

綜上所述:

  • 定義property屬性共有兩種方式,分別是【裝飾器】和【類屬性】,而【裝飾器】方式針對經(jīng)典類和新式類又有所不同。
  • 通過使用property屬性,能夠簡化調(diào)用者在獲取數(shù)據(jù)的流程

4. property屬性-應用

4.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:不是整型數(shù)字")

4.2. 使用property升級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:不是整型數(shù)字")

  # 定義一個屬性,當對這個money設置值時調(diào)用setMoney,當獲取值時調(diào)用getMoney
  money = property(getMoney, setMoney) 

a = Money()
a.money = 100 # 調(diào)用setMoney方法
print(a.money) # 調(diào)用getMoney方法
#100

4.3. 使用property取代getter和setter方法

重新實現(xiàn)一個屬性的設置和讀取方法,可做邊界判定

class Money(object):
  def __init__(self):
    self.__money = 0

  # 使用裝飾器對money進行裝飾,那么會自動添加一個叫money的屬性,當調(diào)用獲取money的值時,調(diào)用裝飾的方法
  @property
  def money(self):
    return self.__money

  # 使用裝飾器對money進行裝飾,當對money設置值時,調(diào)用裝飾的方法
  @money.setter
  def money(self, value):
    if isinstance(value, int):
      self.__money = value
    else:
      print("error:不是整型數(shù)字")

a = Money()
a.money = 100
print(a.money)

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI