Python property、setter、deleter

来源:https://www.cnblogs.com/Mickey-7/archive/2023/04/11/17306118.html
-Advertisement-
Play Games

面向對象封裝特點之一就是通過實現好的方法來訪問,限制對數據的不合理訪問,把對象狀態私有化,僅供類的內部進行操作 下方示例,Test方法的number屬性類實例的時候傳遞1,number是一個公開屬性,可以在外部任意修改、訪問,沒有對屬性進行進行約束 class Test: def __init__( ...


面向對象封裝特點之一就是通過實現好的方法來訪問,限制對數據的不合理訪問,把對象狀態私有化,僅供類的內部進行操作

下方示例,Test方法的number屬性類實例的時候傳遞1,number是一個公開屬性,可以在外部任意修改、訪問,沒有對屬性進行進行約束

class Test:
  def __init__(self,number)
  	self.number = number

if __name__ == '__main__':
  test = Test(1)
  print(test.number)
  test.number = -100
  print(test.number) 
@property

@property的作用是聲明一個只讀屬性,在函數上裝飾,像調用屬性一樣的去調用這個函數,對象.屬性的方式操作,內部可以做一些邏輯判斷,需要註意的兩點

  • 調用被裝飾方法的時候不+括弧
  • 方法定義有且只能有self一個參數
class Test:
    def __init__(self, number):
        self.__number = number

    @property  # 聲明number屬性,只讀
    def number(self):
        if self.__number >= 100:
            raise ValueError('範圍超出100')
        return self.__number


if __name__ == '__main__':
    test = Test(3)  
    print(test.number)  # 3

@func.setter

setter就是給@property聲明的屬性設置值,func是當前函數的名字,但是當前函數setter,又需要指向property,所以property聲明的函數名 和 setter的函數名需要一致,根據賦值操作還是獲取操作決定走哪個方法

class Test:
  def __init__(self,number):
    self.__number = None
    
  @property # 聲明屬性
  def number(self):
    if self.__number >= 100:
      raise ValueError('範圍超出100')
    return self.__number
  
  @number.setter # 設置屬性
  def number(self,number)
  		self.__number = number
    
'''
聲明和設置屬性的函數名字可以完全自定義,但是要與初始化變數名做區分,如果都一樣的話會出現同名遞歸報錯
'''

test = Test()
test.number = 30  # setter 設置值
print(test.number) #property聲明的number獲取值
@func.deleter

deleter裝飾器見名知意,就是屬性的刪除操作,實際開發過程中,具體實現的邏輯由我們自己實現,當del屬性的時候,會觸發該裝飾器函數內的流程,但是是否是刪除操作,根據業務場景來實現

class Test:

    def __init__(self):
        self.__number = None

    @property
    def number(self):
        return self.__number

    @number.setter
    def number(self, number):
        self.__number = number

    @number.deleter
    def number(self):
        self.__number = 100


if __name__ == '__main__':
    test = Test()
    test.number = 10
    print(test.number)  # 10
    del test.number
    print(test.number)  # 100
'''
該示例中,deleter的方法中將number設置為了100,
del test.number後觸發該流程,所以在deleter做什麼事情,由自己決定,
可以是 del self.__number 也可有是self.__number=None等等,del只是觸發條件
'''
property(fget,fset)

除了上面使用裝飾器聲明,還可有在類中設置屬性指向property()對象,設置set和get的方法以及del方法

class Test:

    def __init__(self):
        self.__number = None

    def get_number(self):
        return self.__number

    def set_number(self, number):
        self.__number = number

    def del_number(self):
        del self.__number

    # 設置number屬性指向property對象
    # fget 獲取的時候觸發的方法
    # fset 賦值的時候觸發的方法
    # fdel 刪除的時候觸發的方法

    number = property(fget=get_number, fset=set_number, fdel=del_number)


if __name__ == '__main__':
    test = Test()
    test.number = 100
    print(test.number)
    del test.number

風月都好看,人間也浪漫.
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 昨天出現一個生產問題。我們的channel系統代碼里,調用其中一個三方服務商的http介面時未設置超時時間。碰巧昨天出現一筆http請求持續數小時始終無響應,加之程式是單線程處理交易請求,就出現因為線程一直處於RUNNABLE狀態而導致系統生產能力嚴重下降。 現在說這個結論很easy,而昨天排查這個 ...
  • 1.struct 簡單介紹 struct 是 Python 的內置模塊, 在使用 socket 通信的時候, 大多數據的傳輸都是以二進位流的形式的存在, 而 struct 模塊就提供了一種機制, 該機制可以將某些特定的結構體類型打包成二進位流的字元串然後再網路傳輸,而接收端也應該可以通過某種機制進行 ...
  • Kafka 環境搭建 kafka 安裝、配置、啟動、測試說明: 1. 安裝:直接官網下載安裝包,解壓到指定位置即可(kafka 依賴的 Zookeeper 在文件中已包含) 下載地址:https://kafka.apache.org/downloads 示例版本:kafka_2.13-2.8.0.t ...
  • SpringCloud OpenFeign-服務調用 1.OpenFeign介紹 https://github.com/spring-cloud/spring-cloud-openfeign OpenFeign是一個聲明式WebService客戶端,使用OpenFeign讓編寫Web Service ...
  • 說明 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇介紹使用 VLD 時的註意事項。同系列文章目錄可見 《記憶體泄漏檢測工具》目錄 1. 官網文檔 可以在 Using-Visual-Leak-Detector 官方文檔里看到如何使用 VLD。 2. 註意事項 以 v2.5.1 版本為例, ...
  • 線程池ThreadPoolExecutor ThreadPoolExecutor 繼承結構 繼承結構如圖所示:ThreadPoolExecutor <- AbstractExecutorService <- ExecutorService <- Executor public class Threa ...
  • Map ​ 哈希表是一種巧妙並且實用的數據結構。它是一個無序的key/value對的集合,其中所有的key 都是不同的,然後通過給定的key可以在常數時間複雜度內檢索、更新或刪除對應的value。 ​ 在Go語言中,一個map就是一個哈希表的引用,map類型可以寫為map[K]V,其中K和V分別 對 ...
  • MongoDB索引優化 作者: 博學谷狂野架構師 GitHub:GitHub地址 (有我精心準備的130本電子書PDF) 只分享乾貨、不吹水,讓我們一起加油!😄 索引簡介 索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取數據時必須掃描集合中的每個文件並選取那些符合查詢條件的記錄 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...