LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

30天學會Python編程:9. Python 屬性裝飾器(@property)

admin
2025年7月17日 21:49 本文熱度 296

@property 裝飾器是 Python 中實現屬性訪問控制的強大工具,它允許你將方法轉換為"動態屬性",提供更精細的屬性訪問控制。

一、為什么需要 @property?

在面向對象編程中,直接暴露類的屬性存在以下問題:

  1. 無法驗證數據:無法在賦值時檢查數據有效性
  2. 無法動態計算:屬性值不能基于其他屬性動態計算
  3. 破壞封裝性:外部可直接修改內部狀態

@property 解決了這些問題,讓你能夠:

  • 在屬性訪問時執行自定義邏輯
  • 創建只讀屬性
  • 實現數據驗證
  • 動態計算屬性值

二、基本語法結構

class MyClass:
    def__init__(self, value):
        self._value = value  # 內部使用帶下劃線的變量名
    
    @property
    defvalue(self):
        """Getter方法:訪問屬性時調用"""
        returnself._value
    
    @value.setter
    defvalue(self, new_value):
        """Setter方法:設置屬性時調用"""
        if new_value < 0:
            raise ValueError("值不能為負數")
        self._value = new_value
    
    @value.deleter
    defvalue(self):
        """Deleter方法:刪除屬性時調用"""
        print("刪除值!")
        delself._value

三、功能解釋

1. 只讀屬性(無 setter)

class Circle:
    def__init__(self, radius):
        self.radius = radius
    
    @property
    defarea(self):
        """只讀屬性:計算圓的面積"""
        return3.14 * self.radius ** 2

# 使用
c = Circle(5)
print(c.area)  # 78.5
c.area = 100# 報錯:AttributeError: can't set attribute

2. 數據驗證

class Temperature:
    def__init__(self, celsius):
        self.celsius = celsius  # 使用setter
    
    @property
    defcelsius(self):
        returnself._celsius
    
    @celsius.setter
    defcelsius(self, value):
        if value < -273.15:
            raise ValueError("溫度不能低于絕對零度")
        self._celsius = value

# 使用
temp = Temperature(25)
temp.celsius = -300# ValueError: 溫度不能低于絕對零度

3. 屬性別名

class Person:
    def__init__(self, first_name, last_name):
        self.first_name = first_name
        self.last_name = last_name
    
    @property
    deffull_name(self):
        """動態計算全名"""
        returnf"{self.first_name} {self.last_name}"
    
    @full_name.setter
    deffull_name(self, name):
        """通過全名設置姓名"""
        first, last = name.split(" "1)
        self.first_name = first
        self.last_name = last

# 使用
p = Person("張""三")
print(p.full_name)  # 張 三
p.full_name = "李 四"
print(p.first_name)  # 李

四、更多用法

1. 屬性緩存

class ExpensiveCalculation:
    def__init__(self):
        self._result = None
    
    @property
    defresult(self):
        """緩存計算結果"""
        ifself._result isNone:
            print("執行復雜計算...")
            self._result = self._calculate()
        returnself._result
    
    def_calculate(self):
        # 模擬復雜計算
        returnsum(range(11000000))

# 使用
calc = ExpensiveCalculation()
print(calc.result)  # 第一次調用會計算
print(calc.result)  # 直接返回緩存結果

2. 屬性依賴

class Rectangle:
    def__init__(self, width, height):
        self.width = width
        self.height = height
    
    @property
    defarea(self):
        returnself.width * self.height
    
    @property
    defperimeter(self):
        return2 * (self.width + self.height)
    
    @property
    defaspect_ratio(self):
        """寬高比(只讀)"""
        returnself.width / self.height
    
    @aspect_ratio.setter
    defaspect_ratio(self, ratio):
        """通過寬高比設置尺寸,保持面積不變"""
        current_area = self.area
        self.width = (current_area * ratio) ** 0.5
        self.height = current_area / self.width

# 使用
rect = Rectangle(43)
print(f"原始尺寸: {rect.width}x{rect.height}")  # 4x3
rect.aspect_ratio = 16/9
print(f"新尺寸: {rect.width:.1f}x{rect.height:.1f}")  # 6.5x3.7

五、注意事項

  1. 命名規范

    • 使用單下劃線前綴 _var 表示受保護屬性
    • 避免屬性名與方法名沖突
  2. 性能考慮

    • 復雜計算應考慮緩存結果
    • 避免在屬性方法中進行I/O操作
  3. 何時使用

    • 需要數據驗證時
    • 需要動態計算屬性時
    • 需要向后兼容舊接口時
  4. 常見錯誤

    class BadExample:
        @property
        def value(self):
            return self.value  # 遞歸調用自身!

        @value.setter
        def value(self, new_value):
            self.value = new_value  # 遞歸設置!

    正確做法:使用帶下劃線的內部變量

  5. 與普通屬性的區別

    特性
    普通屬性
    @property
    訪問控制
    完全控制
    計算能力
    可動態計算
    驗證機制
    可添加驗證
    接口兼容
    修改破壞接口
    修改保持接口

六、與描述符協議的對比

特性
@property
描述符協議
實現復雜度
簡單
較復雜
復用性
單個類內
可跨類復用
功能范圍
基本屬性控制
高級屬性管理
適用場景
簡單屬性邏輯
復雜屬性系統

選擇建議

  • 90% 的情況使用 @property 足夠
  • 需要跨類復用相同屬性邏輯時使用描述符

七、應用舉例

配置管理系統

class AppConfig:
    def__init__(self):
        self._settings = {}
        self._cache = {}
    
    @property
    deftheme(self):
        """獲取當前主題"""
        returnself._settings.get('theme''light')
    
    @theme.setter
    deftheme(self, value):
        """設置主題并驗證"""
        if value notin ['light''dark''system']:
            raise ValueError("無效的主題選項")
        self._settings['theme'] = value
        self._cache.clear()  # 清除緩存
    
    @property
    defapi_endpoint(self):
        """動態構建API端點"""
        if'api_endpoint'notinself._cache:
            base_url = self._settings.get('base_url''https://api.example.com')
            version = self._settings.get('api_version''v1')
            self._cache['api_endpoint'] = f"{base_url}/{version}/"
        returnself._cache['api_endpoint']

# 使用
config = AppConfig()
config.theme = 'dark'
print(config.theme)  # dark
print(config.api_endpoint)  # https://api.example.com/v1/

總結

@property 裝飾器是 Python 面向對象編程中不可或缺的工具:

  1. 提供優雅的屬性訪問控制
  2. 保持類接口簡潔一致
  3. 支持數據驗證和動態計算
  4. 增強代碼可維護性和安全性

關鍵要點

  • 使用 @property 定義 getter 方法
  • 使用 @x.setter 定義 setter 方法
  • 使用 @x.deleter 定義 deleter 方法
  • 內部使用帶下劃線變量存儲實際數據
  • 優先用于簡單屬性邏輯,復雜場景考慮描述符

掌握 @property 更加 Pythonic地設計類,在保持接口簡潔的同時實現強大的屬性控制功能。


閱讀原文:原文鏈接


該文章在 2025/7/18 10:34:59 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

黄频国产免费高清视频,久久不卡精品中文字幕一区,激情五月天AV电影在线观看,欧美国产韩国日本一区二区
亚洲中文字幕一二区精品自拍 | 无打码H中文视频在线观看 中文字幕国产AV | 亚洲色婷婷一区二区三区 | 偷自拍亚洲视频在线观看 | 中文字幕在线亚洲日韩6页 亚洲亚洲影院第一页 | 亚洲国产原创AV在线播放 |