日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python基础教程:类的property特性

發(fā)布時間:2025/3/20 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python基础教程:类的property特性 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、什么是 property特性

  • property裝飾器用于將被裝飾的方法偽裝成一個數(shù)據(jù)屬性,在使用時可以不用加括號而直接使用
# ############### 定義 ############### class Foo:def func(self):pass# 定義property屬性@propertydef prop(self):pass# ############### 調(diào)用 ############### foo_obj = Foo() foo_obj.func() # 調(diào)用實例方法 foo_obj.prop # 調(diào)用property屬性

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

''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' class Goods(object):@propertydef size(self):return 100g = Goods() print(g.size) 100

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

\1. 定義時,在實例方法的基礎上添加 @property 裝飾器;并且僅有一個self參數(shù)

\2. 調(diào)用時,無需括號

二、簡單示例

對于京東商城中顯示電腦主機的列表頁面,每次請求不可能把數(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ù)
  • ''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' # ############### 定義 ############### class Pager:def __init__(self, current_page):# 用戶當前請求的頁碼(第一頁、第二頁...)self.current_page = current_page# 每頁默認顯示10條數(shù)據(jù)self.per_items = 10@propertydef start(self):val = (self.current_page - 1) * self.per_itemsreturn val@propertydef end(self):val = self.current_page * self.per_itemsreturn val# ############### 調(diào)用 ############### p = Pager(1) print(p.start) # 就是起始值,即:m 0 print(p.end) # 就是結(jié)束值,即:n 10

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

    三、 property屬性的兩種方式

  • 裝飾器 即:在方法上應用裝飾器(推薦使用)
  • 類屬性 即:在類中定義值為property對象的類屬性(Python2歷史遺留)
  • 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 # 刪除商品原價 del

    3.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) laowang

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

  • 第一個參數(shù)是方法名,調(diào)用 對象.屬性 時自動觸發(fā)執(zhí)行方法
  • 第二個參數(shù)是方法名,調(diào)用 對象.屬性 = XXX 時自動觸發(fā)執(zhí)行方法
  • 第三個參數(shù)是方法名,調(diào)用 del 對象.屬性 時自動觸發(fā)執(zhí)行方法
  • 第四個參數(shù)是字符串,調(diào)用 對象.屬性.doc ,此參數(shù)是該屬性的描述信息
  • ''' 遇到問題沒人解答?小編創(chuàng)建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' #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' + valuedef 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 getter...'laowang' obj.BAR = "alex" # 自動調(diào)用第二個參數(shù)中定義的方法:set_bar方法,并將“alex”當作參數(shù)傳入 setter... desc = Foo.BAR.__doc__ # 自動獲取第四個參數(shù)中設置的值:description... print(desc) description... del obj.BAR # 自動調(diào)用第三個參數(shù)中定義的方法:del_bar方法 deleter...

    由于類屬性方式創(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方法 100

    5.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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。