[Python基礎]裝飾器property 將一個方法轉換為屬性

更新於 發佈於 閱讀時間約 9 分鐘

前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。

property也可以動態的取出物件的值,隨著時間其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。

其他裝飾器的文章如下:

[Python基礎]裝飾器AbstractMethods 定義抽象方法

[Python基礎]裝飾器staticmethod 定義靜態方法

[Python基礎]裝飾器classmethod定義類別方法

[Python基礎]淺談裝飾器 decorator

使用 @property 裝飾器建立屬性


當你在 Python 中使用裝飾器 property 時,它通常用於設計 getter 和 setter 方法,以便更靈活地控制對類屬性的訪問和修改。

Property 的裝飾器主要有 3 種語法:

  • Getter: @property 取得屬性的值
  • Setter: @變數名稱.setter 設定屬性的值
  • Deleter: @變數名稱.deleter刪除屬性

程式範例

方法轉換為屬性

@property 裝飾器用在 radiusarea 方法上,分別定義了半徑和面積的屬性。這使得它們可以被像屬性一樣訪問,而不需要使用括號。

class Circle:
def __init__(self, radius):
self._radius = radius

@property
def radius(self):
return self._radius

@property
def area(self):
return 3.14 * self.radius**2

# 創建 Circle 實例
circle_instance = Circle(radius=5)

# 訪問 radius 屬性,實際上調用了 getter 方法
print(circle_instance.radius) # 輸出: 5

# 訪問 area 屬性,同樣調用了 getter 方法
print(circle_instance.area) # 輸出: 78.5

動態計算年齡

age屬性每次被訪問時都會計算當前年份出生年份之間差異返回動態計算的年齡值。這使得 age屬性的值能夠隨著時間的推移而變化,而不需要將年齡固定存儲。

from datetime import date

class Person:
def __init__(self, birth_year):
self._birth_year = birth_year

@property
def birth_year(self):
return self._birth_year

@property
def age(self):
current_year = date.today().year
return current_year - self.birth_year

# 創建 Person 實例
person_instance = Person(birth_year=1988)

# 訪問 age 屬性,動態計算並返回年齡
print(f'我今年是{person_instance.age}歲') # 依據當前年份和出生年份計算年齡

# 輸出
# 我今年是36歲​

property 裝飾器在 Python 中用於定義類的屬性,提供更靈活的方式來訪問、設定刪除屬性的值。

以下是 property 裝飾器的基本介紹,包括 gettersetter deleter 方法:

1. Getter 方法

Getter 方法負責取得屬性的值,使用 @property 裝飾器來定義。它使得你可以像訪問屬性一樣訪問這個方法,而不需要使用括號。

class MyClass:
def __init__(self, value):
self._value = value

@property
def my_property(self):
return self._value

# 使用 getter 取得屬性的值
my_instance = MyClass(value=42)
print(my_instance.my_property) # 輸出: 42

2. Setter 方法

Setter 方法負責設定屬性的值,使用 @<property_name>.setter 裝飾器來定義。它使得你可以像設定屬性一樣設定這個方法。

class MyClass:
def __init__(self, value):
self._value = value

@property
def my_property(self):
return self._value

@my_property.setter
def my_property(self, new_value):
self._value = new_value

# 使用 setter 設定屬性的值
my_instance = MyClass(value=42)
print(my_instance.my_property) # 輸出: 99
my_instance.my_property = 99 # new_value的值 覆蓋 self._value
print(my_instance.my_property) # 輸出: 99

property 裝飾器在 Python 中用於定義類的屬性,提供更靈活的方式來訪問、設定和刪除屬性的值。以下是 property 裝飾器的基本介紹,包括 getter、setter 和 deleter 方法:

1. Getter 方法

Getter 方法負責取得屬性的值,使用 @property 裝飾器來定義。它使得你可以像訪問屬性一樣訪問這個方法,而不需要使用括號。

pythonCopy codeclass MyClass:
def __init__(self, value):
self._value = value

@property
def my_property(self):
return self._value

# 使用 getter 取得屬性的值
my_instance = MyClass(value=42)
print(my_instance.my_property) # 輸出: 42

2. Setter 方法

Setter 方法負責設定屬性的值,使用 @<property_name>.setter 裝飾器來定義。它使得你可以像設定屬性一樣設定這個方法。

pythonCopy codeclass MyClass:
def __init__(self, value):
self._value = value

@property
def my_property(self):
return self._value

@my_property.setter
def my_property(self, new_value):
self._value = new_value

# 使用 setter 設定屬性的值
my_instance = MyClass(value=42)
my_instance.my_property = 99
print(my_instance.my_property) # 輸出: 99

3. Deleter 方法

Deleter 方法負責刪除屬性,使用 @<property_name>.deleter 裝飾器來定義。它使得你可以像刪除屬性一樣刪除這個方法。

class MyClass:
def __init__(self, value):
self._value = value

@property
def my_property(self):
return self._value

@my_property.deleter
def my_property(self):
del self._value

# 使用 deleter 刪除屬性
my_instance = MyClass(value=42)
del my_instance.my_property
# 此後再訪問 my_property 將引發 AttributeError,因為屬性已被刪除

試著呼叫看看,是不是真的刪除了。

刪除屬性在呼叫會引發錯誤

刪除屬性在呼叫會引發錯誤


這三種方法的使用讓你能夠更靈活地控制和管理類的屬性




留言
avatar-img
留言分享你的想法!
avatar-img
螃蟹_crab的沙龍
147會員
265內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
螃蟹_crab的沙龍的其他內容
2025/04/25
在 Python 中,字典(dict)是非常常用的資料結構,用來儲存 key-value 配對。而在操作字典時,.setdefault() 是一個常被忽略但非常實用的方法。 這篇文章會完整介紹 .setdefault() 的語法、用途、與實務範例,幫助你更有效率地處理字典資料。 什麼是 .se
Thumbnail
2025/04/25
在 Python 中,字典(dict)是非常常用的資料結構,用來儲存 key-value 配對。而在操作字典時,.setdefault() 是一個常被忽略但非常實用的方法。 這篇文章會完整介紹 .setdefault() 的語法、用途、與實務範例,幫助你更有效率地處理字典資料。 什麼是 .se
Thumbnail
2025/01/30
Python 程式在電腦上的執行流程 當我們在電腦上執行 Python 程式時,主要經歷以下幾個步驟: 1. 編寫 Python 程式碼 開發者使用文字編輯器或 IDE(如 VS Code、PyCharm)撰寫 Python 程式,並將其存為 .py 檔案。 例如,一個簡單的 Python
Thumbnail
2025/01/30
Python 程式在電腦上的執行流程 當我們在電腦上執行 Python 程式時,主要經歷以下幾個步驟: 1. 編寫 Python 程式碼 開發者使用文字編輯器或 IDE(如 VS Code、PyCharm)撰寫 Python 程式,並將其存為 .py 檔案。 例如,一個簡單的 Python
Thumbnail
2024/10/17
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
Thumbnail
2024/10/17
在一個典型的程式專案中,UI、Controller 和 Main 的分工通常遵循 MVC 模型(Model-View-Controller) 的架構,這是一種常見的設計模式,能夠將應用程式的邏輯和界面進行分離。 大部分典型的程式專案設計: UI (View):專注於用戶界面,展示數據,並將用
Thumbnail
看更多
你可能也想看
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
每年4月、5月都是最多稅要繳的月份,當然大部份的人都是有機會繳到「綜合所得稅」,只是相當相當多人還不知道,原來繳給政府的稅!可以透過一些有活動的銀行信用卡或電子支付來繳,從繳費中賺一點點小確幸!就是賺個1%~2%大家也是很開心的,因為你們把沒回饋變成有回饋,就是用卡的最高境界 所得稅線上申報
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
全球科技產業的焦點,AKA 全村的希望 NVIDIA,於五月底正式發布了他們在今年 2025 第一季的財報 (輝達內部財務年度為 2026 Q1,實際日曆期間為今年二到四月),交出了打敗了市場預期的成績單。然而,在銷售持續高速成長的同時,川普政府加大對於中國的晶片管制......
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
重點摘要: 6 月繼續維持基準利率不變,強調維持高利率主因為關稅 點陣圖表現略為鷹派,收斂 2026、2027 年降息預期 SEP 連續 2 季下修 GDP、上修通膨預測值 --- 1.繼續維持利率不變,強調需要維持高利率是因為關稅: 聯準會 (Fed) 召開 6 月利率會議
Thumbnail
這篇內容,將會用一個簡單的範例,來解釋物件(Object)和實體(Instance)的差別。包括Instance的簡介、ID、物件改變會影響實體。
Thumbnail
這篇內容,將會用一個簡單的範例,來解釋物件(Object)和實體(Instance)的差別。包括Instance的簡介、ID、物件改變會影響實體。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
在 Python 中,dir() 函式用於列舉對象的所有屬性和方法。這包括對象的內建屬性、方法以及自定義的屬性和方法。以下是一個簡單的示例: 列舉所有屬性與方法 class MyClass: def __init__(self): self.attribute1 = 42
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
前幾篇討論到各種裝飾器的用法,本文將介紹另外一種裝飾器,可以將方法轉換成屬性來使用。 property也可以動態的取出物件的值,隨著時間或其他運算改變所產生的值,讓我們繼續往下看更多介紹吧。
Thumbnail
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
Thumbnail
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
Thumbnail
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
Thumbnail
當你想讓原本函式新增其他功能,又不想更動原本函式時,Python提供了一種強大而靈活的工具,那就是裝飾器。 但對於新手來說這個裝飾器,非常抽象難以理解,讓我們繼續往下看,慢慢的抽絲剝繭吧。 在 Python 中,使用「@」當做裝飾器使用的語法糖符號
Thumbnail
當你想讓原本函式新增其他功能,又不想更動原本函式時,Python提供了一種強大而靈活的工具,那就是裝飾器。 但對於新手來說這個裝飾器,非常抽象難以理解,讓我們繼續往下看,慢慢的抽絲剝繭吧。 在 Python 中,使用「@」當做裝飾器使用的語法糖符號
Thumbnail
在日常中我們都會將很多事物定上了一個標籤,例如將商品標記價格,替孩子取姓名,公司上冠上職稱等等。 在Python中也有這種方法,就是字典的形式{ 'name' : 'crab', 'apple', 1000 }去呈現
Thumbnail
在日常中我們都會將很多事物定上了一個標籤,例如將商品標記價格,替孩子取姓名,公司上冠上職稱等等。 在Python中也有這種方法,就是字典的形式{ 'name' : 'crab', 'apple', 1000 }去呈現
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News