日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
在什么情況下使用@property比較好?

我在2016年的時(shí)候,寫過一篇文章,介紹@property裝飾器。4年過去了,本來以為這個(gè)裝飾器使用起來應(yīng)該是很自然的事情,但還是有同學(xué)不知道在什么場景下可以使用它。

創(chuàng)新互聯(lián)是專業(yè)的臨川網(wǎng)站建設(shè)公司,臨川接單;提供做網(wǎng)站、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行臨川網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!

他們是這樣說的:

 
 
 
 
  1. class People: 
  2.     def __init__(self, name): 
  3.         self.name = name 
  4.         self._work = '還沒有找到工作' 
  5.  
  6.     @property 
  7.     def work(self): 
  8.         return self._work 
  9.  
  10.     @work.setter 
  11.     def work(self, value): 
  12.         self._work = value 

運(yùn)行效果如下圖所示:

但實(shí)際上,這段代碼里面,@property裝飾器根本沒有任何存在的必要,代碼完全可以進(jìn)一步簡化:

 
 
 
 
  1. class People: 
  2.     def __init__(self, name): 
  3.         self.name = name 
  4.         self.work = '還沒有找到工作' 

運(yùn)行結(jié)果完全一樣:

那么,使用@property裝飾器的意義在哪里呢?

的確,在上面的例子里,@property裝飾器沒有任何存在的必要,因?yàn)檫@里讀取一個(gè)對象的屬性,僅僅是“返回?cái)?shù)據(jù)”而已。但有些情況下,不僅僅要讀取,還要計(jì)算。

我舉一個(gè)例子,不知道你有沒有這樣的經(jīng)歷,你剛剛看了一眼手機(jī),發(fā)現(xiàn)現(xiàn)在時(shí)間是23:10分。30秒以后,你朋友碰巧問你多少點(diǎn)了,你立刻回答:23:10分。他一看手表,還真是。于是驚呼,你怎么不看表就知道時(shí)間?

例如我們現(xiàn)在要實(shí)現(xiàn)一個(gè)ProxyProvider類,它讀取 Redis,獲取最新的代理 IP,然后隨機(jī)返回一條。另外有一個(gè)程序,會(huì)增加新的代理 IP 到 Redis 中。但頻率不高。

所以,ProxyProvider這個(gè)類,不需要每次獲取 IP 的時(shí)候都讀取數(shù)據(jù)庫,每小時(shí)讀取一次就可以了。如果不用@property裝飾器,你可能會(huì)這樣寫代碼:

 
 
 
 
  1. import time 
  2. import random 
  3.  
  4.  
  5. class ProxyProvider: 
  6.     def __init__(self): 
  7.         self.pool = [] 
  8.         self.last_update_time = 0 
  9.  
  10.     def get_proxy(self): 
  11.         now = time.time() 
  12.         if now - self.last_update_time > 3600 or not self.pool: 
  13.             selfself.pool = self.get_all_proxies_from_redis() 
  14.         return random.choice(self.pool) 

如果你經(jīng)常看 Java 代碼,你會(huì)發(fā)現(xiàn)大量的這種get_xxx、set_xxx的寫法。

于是,調(diào)用的時(shí)候,要這樣調(diào)用:

 
 
 
 
  1. provider = ProxyProvider() 
  2. provider.get_proxy() 

如果用@property,那么代碼可以改寫為:

 
 
 
 
  1. import time 
  2. import random 
  3.  
  4.  
  5. class ProxyProvider: 
  6.     def __init__(self): 
  7.         self.pool = [] 
  8.         self.last_update_time = 0 
  9.  
  10.     @property 
  11.     def proxy(self): 
  12.         now = time.time() 
  13.         if now - self.last_update_time > 3600 or not self.pool: 
  14.             selfself.pool = self.get_all_proxies_from_redis() 
  15.         return random.choice(self.pool) 

于是讀取的時(shí)候,這樣寫:

 
 
 
 
  1. provider = ProxyProvider() 
  2. provider.proxy  # 注意這里不加括號 

我們可以看到,整體代碼邏輯是一樣的,代碼里并沒有精簡。不過在調(diào)用的時(shí)候,前者是調(diào)用一個(gè)方法,后者是讀取一個(gè)屬性。

同理,如果要修改數(shù)據(jù),不使用@property的時(shí)候,需要實(shí)現(xiàn)一個(gè)set_xxx方法。但是使用了@property裝飾一個(gè)方法,也可以在設(shè)置數(shù)據(jù)的時(shí)候?qū)崿F(xiàn)一些內(nèi)部邏輯,例如:

 
 
 
 
  1. import time 
  2. import random 
  3.  
  4.  
  5. class ProxyProvider: 
  6.     def __init__(self): 
  7.         self.pool = [] 
  8.         self.special_ip = set() 
  9.         self.last_update_time = 0 
  10.  
  11.     @property 
  12.     def proxy(self): 
  13.         now = time.time() 
  14.         if now - self.last_update_time > 3600 or not self.pool: 
  15.             selfself.pool = self.get_all_proxies_from_redis() 
  16.         return random.choice(self.pool + list(self.special)) 
  17.  
  18.     @proxy.setter 
  19.     def proxy(self, value): 
  20.         if not value.startswith('http'): 
  21.             proxy = f'http://{ip}' 
  22.         if proxy in self.special_ip: 
  23.             return 
  24.         self.special_ip.add(proxy) 

而對于調(diào)用者來說,這些復(fù)雜的檢查邏輯都是透明的:

 
 
 
 
  1. provider = ProxyProvider() 
  2. provider.proxy = '123.45.67.89' 

對于習(xí)慣于 Java 的人來說,他們可能喜歡顯式寫出get_xxx和set_xxx方法。但是對于習(xí)慣 Python 的人來說,我覺得使用@property會(huì)讓代碼的可讀性更好。


本文名稱:在什么情況下使用@property比較好?
文章網(wǎng)址:http://www.dlmjj.cn/article/cophidh.html