Python學習:property裝飾器

来源:https://www.cnblogs.com/python1111/archive/2022/09/28/16738386.html
-Advertisement-
Play Games

1.property 裝飾器:裝飾器是在不修改被裝飾對象源代碼以及調用方式的前提下為被裝飾對象添加新功能的可調用對象 property是一個裝飾器,是用來綁定給對象的方法偽造成一個數據屬性 裝飾器property,可以將類中的函數“偽裝成”對象的數據屬性,對象在訪問該特殊屬性時會觸發功能的執行,然後 ...


1.property

裝飾器:裝飾器是在不修改被裝飾對象源代碼以及調用方式的前提下為被裝飾對象添加新功能的可調用對象

property是一個裝飾器,是用來綁定給對象的方法偽造成一個數據屬性

裝飾器property,可以將類中的函數“偽裝成”對象的數據屬性,對象在訪問該特殊屬性時會觸發功能的執行,然後將返回值作為本次訪問的結果。

使用property有效地保證了屬性訪問的一致性。另外property還提供設置和刪除屬性的功能

應用場景:有的功能屬性聽起來更像數據屬性,python則提供了一種裝飾器,可以將功能屬性偽裝成數據屬性

2.案例:

"""
成人的BMI數值:
過輕:低於18.5
正常:18.5-23.9
過重:24-27
肥胖:28-32
非常肥胖, 高於32
  體質指數(BMI)=體重(kg)÷身高^2(m)
  EX:70kg÷(1.75×1.75)=22.86
"""  

案例一:

 class People:
     def __init__(self, name, weight, height):
         self.name = name
         self.weight = weight
         self.height = height

# 定義函數的原因1:
# 1、從bmi的公式上看,bmi應該是觸發功能計算得到的
# 2、bmi是隨著身高、體重的變化而動態變化的,不是一個固定的值
#    說白了,每次都是需要臨時計算得到的

# 但是bmi聽起來更像是一個數據屬性,而非功能
	 @property
	 def bmi(self):
		return self.weight / (self.height ** 2)


 obj1 = People('egon', 70, 1.83)
 print(obj1.bmi())

 obj1.height=1.86
 print(obj1.bmi())

 print(obj1.bmi)

案例二:

'''
學習中遇到問題沒人解答?小編創建了一個Python學習交流群:711312441
尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書!
'''
 class People:
     def __init__(self, name):
         self.__name = name

     def get_name(self):
         return self.__name

     def set_name(self, val):
         if type(val) is not str:
             print('必須傳入str類型')
             return
         self.__name = val

     def del_name(self):
         print('不讓刪除')
         # del self.__name

     name=property(get_name,set_name,del_name)

 obj1=People('egon')
 # print(obj1.get_name())
 # obj1.set_name('EGON')
 # print(obj1.get_name())
 # obj1.del_name()



 # 人正常的思維邏輯
 print(obj1.name) #
 # obj1.name=18
 # del obj1.name

案例三:

class People:
    def __init__(self, name):
        self.__name = name


    @property
    def name(self): # obj1.name
        return self.__name

    @name.setter
    def name(self, val): # obj1.name='EGON'
        if type(val) is not str:
            print('必須傳入str類型')
            return
        self.__name = val

    @name.deleter
    def name(self): # del obj1.name
        print('不讓刪除')
        # del self.__name


obj1=People('egon')
# 人正常的思維邏輯
print(obj1.name) #
# obj1.name=18
# del obj1.name

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

-Advertisement-
Play Games
更多相關文章
  • 2.Class類 2.1基本介紹 Class類也是類,因此也繼承Object類 Class類對象不是new出來的,而是系統創建的 對於某個類的Class類對象,在記憶體中只有一份,因為類只載入一次 每個類的實例都會記得自己是由哪個Class實例所生成 通過Class對象可以得到一個類的完整結構(通過一 ...
  • 綜述下關鍵點,代碼規範檢查基本原理可以基於AST語法樹來進行實現;AST結合Xpath可以方便進行相關規範規則的編寫;通過 PMD-Designer 能可視化的幫助我們實現 XPath 的相關代碼規範規則以及驗證相關規則;給出了一個例子... ...
  • 概念 線程死鎖描述的是這樣一種情況:多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源被釋放。由於線程被無限期地阻塞,因此程式不可能正常終止。 我和同學都打掃衛生,我拿著掃帚等他的簸箕,他拿著簸箕等我的掃帚 產生條件 互斥條件:同一時刻一線程只能占用一個資源。 同一時刻,我拿著掃帚,他拿著簸箕 ...
  • 面向過程與函數式 面向過程 ”面向過程“核心是“過程”二字,“過程”指的是解決問題的步驟,即先乾什麼再乾什麼......,基於面向過程開發程式就好比在設計一條流水線,是一種機械式的思維方式,這正好契合電腦的運行原理:任何程式的執行最終都需要轉換成cpu的指令流水按過程調度執行,即無論採用什麼語言、 ...
  • java基礎-集合 以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接 https://www.cnblogs.com/lyh1024/p/16738857.html 1.集合框架概述 1.1集合框架 的作用 在實際開發中,我們經常會對一組相同類型的數據進行統一管理操作。到目前為止,我們可以使用數 ...
  • 你知道嗎,在 Jmix 中,REST API 有兩種實現方式! 很多應用是採取前後端分離的方式進行開發。這種模式下,對前端的選擇相對靈活,可以根據團隊的擅長技能選擇流行的 Angular/React/Vue 之一,或者前端為App/小程式等手機應用。Jmix 的一種典型應用場景就是作為這種類型應用程 ...
  • 1.問題分析 1.1. 公司雲桌面win7系統把之前C盤中自帶的py3.7環境給還原了,之前跑得好好的PlayWright案例不能運行了 2.解決過程 2.1. 參考網上的解決方案,說是node的版本問題,但是我將之前可以運行的V12.22.12版本回退到V12.9.1以後,還是不行,但是我發現我的 ...
  • Mac下protobuf生成文件報錯問題解決辦法,windows下就不會這麼麻煩了,如果linux下出現類似報錯信息按照下麵的解決邏輯依然適用。 1、由--go_out引發的報錯 1.報錯信息: user@C02FP58GML7H pbfile % protoc --go_out=./ ./user ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...