日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1. 什么是property屬性

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

# ############### 定義 ###############
class Foo:
 def func(self):
 pass
 # 定義property屬性
 @property
 def prop(self):
 pass
# ############### 調用 ###############
foo_obj = Foo()
foo_obj.func() # 調用實例方法
foo_obj.prop # 調用property屬性
Python property屬性

 

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)
p.start # 就是起始值,即:m
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裝飾器

#coding=utf-8
# ############### 定義 ###############
class Goods:
 """python3中默認繼承object類
 以python2、3執行此程序的結果不同,因為只有在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 # 獲取商品價格
obj.price = 200 # 修改商品原價
del obj.price # 刪除商品原價

3.2 類屬性方式,創建值為property對象的類屬性

當使用類屬性的方式創建property屬性時,經典類和新式類無區別

class Foo:
 def get_bar(self):
 return 'laowang'
 BAR = property(get_bar)
obj = Foo()
reuslt = obj.BAR # 自動調用get_bar方法,并獲取方法的返回值
print(reuslt)

property方法中有個四個參數

第一個參數是方法名,調用 對象.屬性 時自動觸發執行方法

第二個參數是方法名,調用 對象.屬性 = XXX 時自動觸發執行方法

第三個參數是方法名,調用 del 對象.屬性 時自動觸發執行方法

第四個參數是字符串,調用 對象.屬性.doc ,此參數是該屬性的描述信息

#coding=utf-8
class Foo(object):
 def get_bar(self):
 print("getter...")
 return 'laowang'
 def set_bar(self, value): 
 """必須兩個參數"""
 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 # 自動調用第一個參數中定義的方法:get_bar
obj.BAR = "alex" # 自動調用第二個參數中定義的方法:set_bar方法,并將“alex”當作參數傳入
desc = Foo.BAR.__doc__ # 自動獲取第四個參數中設置的值:description...
print(desc)
del obj.BAR # 自動調用第三個參數中定義的方法:del_bar方法

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

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 # 刪除商品原價

4. Django框架中應用了property屬性(了解)

WEB框架 Django 的視圖中 request.POST 就是使用的類屬性的方式創建的屬性

class WSGIRequest(http.HttpRequest):
 def __init__(self, environ):
 script_name = get_script_name(environ)
 path_info = get_path_info(environ)
 if not path_info:
 # Sometimes PATH_INFO exists, but is empty (e.g. accessing
 # the SCRIPT_NAME URL without a trailing slash). We really need to
 # operate as if they'd requested '/'. Not amazingly nice to force
 # the path like this, but should be harmless.
 path_info = '/'
 self.environ = environ
 self.path_info = path_info
 self.path = '%s/%s' % (script_name.rstrip('/'), path_info.lstrip('/'))
 self.META = environ
 self.META['PATH_INFO'] = path_info
 self.META['SCRIPT_NAME'] = script_name
 self.method = environ['REQUEST_METHOD'].upper()
 _, content_params = cgi.parse_header(environ.get('CONTENT_TYPE', ''))
 if 'charset' in content_params:
 try:
 codecs.lookup(content_params['charset'])
 except LookupError:
 pass
 else:
 self.encoding = content_params['charset']
 self._post_parse_error = False
 try:
 content_length = int(environ.get('CONTENT_LENGTH'))
 except (ValueError, TypeError):
 content_length = 0
 self._stream = LimitedStream(self.environ['wsgi.input'], content_length)
 self._read_started = False
 self.resolver_match = None
 def _get_scheme(self):
 return self.environ.get('wsgi.url_scheme')
 def _get_request(self):
 warnings.warn('`request.REQUEST` is deprecated, use `request.GET` or '
 '`request.POST` instead.', RemovedInDjango19Warning, 2)
 if not hasattr(self, '_request'):
 self._request = datastructures.MergeDict(self.POST, self.GET)
 return self._request
 @cached_property
 def GET(self):
 # The WSGI spec says 'QUERY_STRING' may be absent.
 raw_query_string = get_bytes_from_wsgi(self.environ, 'QUERY_STRING', '')
 return http.QueryDict(raw_query_string, encoding=self._encoding)
 # ############### 看這里看這里 ###############
 def _get_post(self):
 if not hasattr(self, '_post'):
 self._load_post_and_files()
 return self._post
 # ############### 看這里看這里 ###############
 def _set_post(self, post):
 self._post = post
 @cached_property
 def COOKIES(self):
 raw_cookie = get_str_from_wsgi(self.environ, 'HTTP_COOKIE', '')
 return http.parse_cookie(raw_cookie)
 def _get_files(self):
 if not hasattr(self, '_files'):
 self._load_post_and_files()
 return self._files
 # ############### 看這里看這里 ###############
 POST = property(_get_post, _set_post)
 FILES = property(_get_files)
 REQUEST = property(_get_request)

綜上所述:

定義property屬性共有兩種方式,分別是【裝飾器】和【類屬性】,而【裝飾器】方式針對經典類和新式類又有所不同。

通過使用property屬性,能夠簡化調用者在獲取數據的流程

property屬性-應用

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:不是整型數字")

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:不是整型數字")
 # 定義一個屬性,當對這個money設置值時調用setMoney,當獲取值時調用getMoney
 money = property(getMoney, setMoney) 
a = Money()
a.money = 100 # 調用setMoney方法
print(a.money) # 調用getMoney方法
#100

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

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

class Money(object):
 def __init__(self):
 self.__money = 0
 # 使用裝飾器對money進行裝飾,那么會自動添加一個叫money的屬性,當調用獲取money的值時,調用裝飾的方法
 @property
 def money(self):
 return self.__money
 # 使用裝飾器對money進行裝飾,當對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)

分享到:
標簽:Python property
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定