Python基础教程:类的property特性
一、什么是 property特性
- property裝飾器用于將被裝飾的方法偽裝成一個數(shù)據(jù)屬性,在使用時可以不用加括號而直接使用
如下的例子用于說明如何定一個簡單的property屬性:
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Goods(object):@propertydef size(self):return 100g = Goods() print(g.size) 100property屬性的定義和調(diào)用要注意一下幾點:
\1. 定義時,在實例方法的基礎上添加 @property 裝飾器;并且僅有一個self參數(shù)
\2. 調(diào)用時,無需括號
二、簡單示例
對于京東商城中顯示電腦主機的列表頁面,每次請求不可能把數(shù)據(jù)庫中的所有內(nèi)容都顯示到頁面上,而是通過分頁的功能局部顯示,所以在向數(shù)據(jù)庫中請求數(shù)據(jù)時就要顯示的指定獲取從第m條到第n條的所有數(shù)據(jù) 這個分頁的功能包括:
從上述可見Python的property屬性的功能是:property屬性內(nèi)部進行一系列的邏輯計算,最終將計算結(jié)果返回。
三、 property屬性的兩種方式
3.1 裝飾器
在類的實例方法上應用 @property 裝飾器
Python中的類有經(jīng)典類和新式類,新式類的屬性比經(jīng)典類的屬性豐富。( 如果類繼object,那么該類是新式類 )
經(jīng)典類,具有一種 @property 裝飾器:
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # ############### 定義 ############### class Goods:@propertydef price(self):return "laowang"# ############### 調(diào)用 ############### obj = Goods() result = obj.price # 自動執(zhí)行 @property 修飾的 price 方法,并獲取方法的返回值 print(result) laowang新式類,具有三種 @property 裝飾器:
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #coding=utf-8 # ############### 定義 ############### class Goods:"""python3中默認繼承object類以python2、3執(zhí)行此程序的結(jié)果不同,因為只有在python3中才有@xxx.setter @xxx.deleter"""@propertydef price(self):print('@property')@price.setterdef price(self, value):print('@price.setter')@price.deleterdef price(self):print('@price.deleter')# ############### 調(diào)用 ############### obj = Goods() obj.price # 自動執(zhí)行 @property 修飾的 price 方法,并獲取方法的返回值 @property obj.price = 123 # 自動執(zhí)行 @price.setter 修飾的 price 方法,并將 123 賦值給方法的參數(shù) @price.setter del obj.price # 自動執(zhí)行 @price.deleter 修飾的 price 方法 @price.deleter注意:
- 經(jīng)典類中的屬性只有一種訪問方式,其對應被 @property 修飾的方法
- 新式類中的屬性有三種訪問方式,并分別對應了三個被 @property、@方法名.setter、@方法名.deleter 修飾的方法
由于新式類中具有三種訪問方式,我們可以根據(jù)它們幾個屬性的訪問特點,分別將三個方法定義為對同一個屬性:獲取、修改、刪除
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Goods(object):def __init__(self):# 原價self.original_price = 100# 折扣self.discount = 0.8@propertydef price(self):# 實際價格 = 原價 * 折扣new_price = self.original_price * self.discountreturn new_price@price.setterdef price(self, value):self.original_price = value@price.deleterdef price(self):print('del')del self.original_priceobj = Goods() print(obj.price) # 獲取商品價格 80.0 obj.price = 200 # 修改商品原價 print(obj.price) 160.0 del obj.price # 刪除商品原價 del3.2 類屬性方式
創(chuàng)建值為property對象的類屬性
注意:當使用類屬性的方式創(chuàng)建property屬性時,經(jīng)典類和新式類無區(qū)別
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Foo:def get_bar(self):return 'laowang'BAR = property(get_bar)obj = Foo() reuslt = obj.BAR # 自動調(diào)用get_bar方法,并獲取方法的返回值 print(reuslt) laowangproperty方法中有個四個參數(shù)
由于類屬性方式創(chuàng)建property屬性具有3種訪問方式,我們可以根據(jù)它們幾個屬性的訪問特點,分別將三個方法定義為對同一個屬性:獲取、修改、刪除
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Goods(object):def __init__(self):# 原價self.original_price = 100# 折扣self.discount = 0.8def get_price(self):# 實際價格 = 原價 * 折扣new_price = self.original_price * self.discountreturn new_pricedef set_price(self, value):self.original_price = valuedef del_price(self):del self.original_pricePRICE = property(get_price, set_price, del_price, '價格屬性描述...')obj = Goods() obj.PRICE # 獲取商品價格 80.0 obj.PRICE = 200 # 修改商品原價 print(obj.PRICE) 160.0 del obj.PRICE # 刪除商品原價綜上所述:
- 定義property屬性共有兩種方式,分別是【裝飾器】和【類屬性】,而【裝飾器】方式針對經(jīng)典類和新式類又有所不同。
- 通過使用property屬性,能夠簡化調(diào)用者在獲取數(shù)據(jù)的流程
四、property+類的封裝
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class People:def __init__(self, name):self.__name = name@property # 查看obj.namedef name(self):return '<名字是:%s>' % self.__namepeo1 = People('nick') print(peo1.name) <名字是:nick> try:peo1.name = 'EGON' except Exception as e:print(e) can't set attribute五、應用
5.1 私有屬性添加getter和setter方法
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Money(object):def __init__(self):self.__money = 0def getMoney(self):return self.__moneydef setMoney(self, value):if isinstance(value, int):self.__money = valueelse:print("error:不是整型數(shù)字")5.2 使用property升級getter和setter方法
''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Money(object):def __init__(self):self.__money = 0def getMoney(self):return self.__moneydef setMoney(self, value):if isinstance(value, int):self.__money = valueelse:print("error:不是整型數(shù)字")# 定義一個屬性,當對這個money設置值時調(diào)用setMoney,當獲取值時調(diào)用getMoneymoney = property(getMoney, setMoney)a = Money() a.money = 100 # 調(diào)用setMoney方法 print(a.money) # 調(diào)用getMoney方法 1005.3 使用property取代getter和setter方法
重新實現(xiàn)一個屬性的設置和讀取方法,可做邊界判定
class Money(object):def __init__(self):self.__money = 0# 使用裝飾器對money進行裝飾,那么會自動添加一個叫money的屬性,當調(diào)用獲取money的值時,調(diào)用裝飾的方法@propertydef money(self):return self.__money# 使用裝飾器對money進行裝飾,當對money設置值時,調(diào)用裝飾的方法@money.setterdef money(self, value):if isinstance(value, int):self.__money = valueelse:print("error:不是整型數(shù)字")a = Money() a.money = 100 print(a.money) 100總結(jié)
以上是生活随笔為你收集整理的Python基础教程:类的property特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python基础教程:菱形继承问题
- 下一篇: Python面向对象:isinstanc