python 描述符

来源:http://www.cnblogs.com/tanker/archive/2017/12/18/8053761.html
-Advertisement-
Play Games

你們單位在國外搞了個伺服器,立足於美利堅,受美國法律保護。用來存放你懂的資源,以圖片和電影為主。最近流量非常可觀,為了更好的服務客戶,改善用戶體驗。 你們老闆決定增加一個投票區,用戶可以給自己喜愛的作品投票,每個月評出最喜愛作品,並且從用戶中挑選3名用戶作為獲獎用戶,獎品為蒼老師簽名寫真集。這還不簡 ...


    你們單位在國外搞了個伺服器,立足於美利堅,受美國法律保護。用來存放你懂的資源,以圖片和電影為主。最近流量非常可觀,為了更好的服務客戶,改善用戶體驗。

  你們老闆決定增加一個投票區,用戶可以給自己喜愛的作品投票,每個月評出最喜愛作品,並且從用戶中挑選3名用戶作為獲獎用戶,獎品為蒼老師簽名寫真集。這還不簡單

  不就是一個投票嘛,先寫一個類,咔咔你就寫完了,代碼是這樣的。

class MovieVoted(object):
	def __init__(self, title, score, actor):
		self.title = title
		self.score = score
		self.actor = actor

	def voted(self, value):
		return {'title':self.title,'score':self.score,'actor':self.actor}

    很快你把代碼完善以後就上線,對自己的結果很滿意。想必老闆也會給升職加薪,到時候迎娶前臺妹子過上人生巔峰。正當陶醉在美夢的時候,突然聽到老闆在辦公室罵罵咧咧:哪個傻X做的。

  這時候你感覺不對,立馬上到你們的網站,看到你們的評選域出現了很多負分,電影評分是負分怎麼行呢。原來是隔壁老李和你們家乾的是一樣的業務,發現你們有這個功能以後就到你們把電

  影評分都評為負的,給用戶帶來了不好的體驗。老闆罵了你一頓後,並且告訴你今天不把這個事情解決明天就不用來了。

 

    面對需求毫無頭緒,難道人生就是這麼殘酷麽。你立馬想到去年在東莞時認識的程式員老王,老王畢竟是大廠工程師,見過大世面,想必很多奇淫技巧不在話下。於是你就給老王打電話

  老王好像不方便,聽那聲音好像在跑步。5分鐘後老王給你回了電話,你跟他說說具體情況,不一會兒老王把你的代碼給改了改,給你發了回來。

class Attr(object):
	def __init__(self, name, type_):
		self.name = name
		self.type_ = type_

	def __get__(self, instance, owner):
		return instance.__dict__[self.name]

	def __delete__(self, instance):
		del instance.__dict__[self.name]

	def __set__(self, instance, value):
		if not isinstance(value, self.type_):
			raise TypeError('expected an %s' % self.type_)
		if self.name == 'score' and value < 0:
			raise ValueError('score can not be negative')
		instance.__dict__[self.name] = value


class MovieVoted(object):
	score = Attr('score', int)
	title = Attr('title', str)
	actor = Attr('actor', str)

	def voted(self, value):
		return {'title': self.title, 'score': self.score, 'actor': self.actor}


m1 = MovieVoted()
m1.title = 'xxx'
m1.actor = '蒼井空'
m1.score = 10
#m1.score = -10          #這時候會報錯

    不愧是見過世面的人,一下子就寫出來。不過有很多東西你都沒見過,這時候老王給你耐心解釋。你原來的程式不行是因為你定義的類,對於實例的變數是沒有任何限制的,可以賦值為

  任意類型,也可以賦值為任意大小。分數可以賦值為str類型的,當然也可以賦值為負數。現在你需要做的是對實例變數賦值的時候加上一定的條件。python在這方面提供了一個很好的功能

  即描述符。你看到函數中出現的__get__、__set__、__delete__就是描述符函數。下麵分別給你解釋一下。

 

1def __get__(self, instance, owner):

這個函數將會在查詢值的時候被觸發,即print(m1.title) 的時候。instance,owner是它自動會接收的兩個參數,instance即m1這個實例,owner即instance所屬的類,即MovieVoted.這個函數被觸發
通過實例內置方法__dict__[self.name]的方法將值查詢到,並且返回。

2.def __set__(self, instance, value):
這個函數將會在設定值的時候被觸發,instance代表著當前實例,即m1,value代表著設定的值即'蒼井空'。首先判斷value的值是否屬於預先設定的類型,即self.type_這裡預先設定的是 str類型。如果不屬於

就會觸發TypeError,這裡加了一層限制,title的值只能為字元串,有點像靜態語言,事先將一個變數的類型固定下來。如果類型沒有問題,再判斷是不是'score',如果是,並且數字小於0,即觸發一個ValueError.

3.def __delete__(self, instance):
這個和__get__很像,在刪除屬性的時候被觸發,比如del m1.title的時候就會觸發。

這裡面有一個需要註意的地方是,實例一開始並沒有初始化變數。而統一用的都是類裡面的變數,千萬不要把類變數放到初始化函數裡面哦。放進去雖然能正常運行,但是就起不到描述符的作用了。

不愧是見過世面的人,你對老王的崇拜之情又進一步加強了,並且約好了下一再一起去東莞。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄: 前言 基礎學習資料與網站介紹 定製我的博文 3.1 我想要的效果 3.2 基礎知識如何實現 3.2.1 一級標題 3.2.2 二級標題 3.2.3 三級標題 3.2.4 目錄 3.2.5 添加小鏈接 3.3 博客園中具體分塊 3.3.1 整體部分 3.3.2 body部分 3.3.3 博文部 ...
  • 今天主管給了我個需求,說要用混合開發,用H5調用本地攝像頭進行掃描二維碼,我之前有做過原生安卓的二維碼掃一掃,主要是通過調用zxing插件進行操作的,其中還弄了個閃光燈.但是純H5的沒接觸過,心裡沒底,於是晚上回家開始網上各處找方案.以下是我對於H5掃描二維碼以及調用本地攝像頭的理解以及代碼.科普網 ...
  • 一場大戲落幕,首屆DDD中國峰會如大會主題色一般的紅。或許在12月9日這一天,全中國的DDD粉絲大約有一半都匯聚在了國家會議中心。聽起來是幸,其實是不幸,因為DDD在中國的人群基數實在是太少了。 因為要負責大會的其中一個Track,期間又要接受採訪,另外還有朋友到訪,所以除了前面的兩個keynote ...
  • 由於某些特定的業務場景,當多個小程式需要一個服務端後臺提供數據時,大家可能想到是HTTP路由。是的,實際上我們使用微服務的GateWay網關也是一樣的,如下圖微服務架構: 網關GateWay的作用在於提供統一的入口來訪問內部的API, 隔離外部訪問與內部系統。集成了非業務性的功能(如安全檢查、頻次限... ...
  • 一:介紹 愛回收是一個和京東回收類似的產品,本質是將用戶不需要的手機,電腦,數位產品等進行回收,我之前使用京東回收過冰箱,感覺京東回收做得蠻好的,通過手機就能搞定一切,然而愛回收我是在兩個月前逛街無意發現的,看到很多年輕人去愛回收提供的設備上搜索商品,它和京東最大的不同是,在查詢回收商品現場,有工作 ...
  • php7從推出到現在,前兩天官方已經發佈到7.2版本,把自己升級和安裝php7中遇到的問題和解決方法做一個筆記,內容主要包括:1) mysql2) php3) nginx4) memcache擴展5) redis擴展 由於內容很長,會分為多篇文章來講述,當然你可能遇到比我更多的問題需要解決,因為我們 ...
  • 指能夠被內置函數`next`調用並不斷返回下一個值,直到最後拋出`StopIteration`錯誤表示無法繼續返回下一個值的對象稱為迭代器(`Iterator`) ...
  • 1002. 寫出這個數 (20) 讀入一個自然數n,計算其各位數字之和,用漢語拼音寫出和的每一位數字。 輸入格式:每個測試輸入包含1個測試用例,即給出自然數n的值。這裡保證n小於10100。 輸出格式:在一行內輸出n的各位數字之和的每一位,拼音數字間有1空格,但一行中最後一個拼音數字後沒有空格。 輸 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...