[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
128會員
213內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
螃蟹_crab的沙龍 的其他內容
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
當你想讓原本函式新增其他功能,又不想更動原本函式時,Python提供了一種強大而靈活的工具,那就是裝飾器。 但對於新手來說這個裝飾器,非常抽象難以理解,讓我們繼續往下看,慢慢的抽絲剝繭吧。 在 Python 中,使用「@」當做裝飾器使用的語法糖符號
在人與人溝通之間,最怕雞同鴨講,彼此不對頻的狀況常會造成誤會。在程式語言中也會出現類似的情況,所以就有一些約定來彼此約束。 PEP 8 是 Python 社群廣泛遵循的一種風格指南,用於提高 Python 程式碼的可讀性和一致性。一開始是 Python 之父 Guido van Rossum 自己
在Python函式中,可以使用None來指定動態的預設引數,使用更靈活,Docstrings同時能夠提供清晰的文檔。本篇文章說明利用這種方式來讓函式更彈性,輸入不同型態的關鍵字引數,並在事件紀錄時間的Log訊息的範例中詮釋,可自行輸入時間或者預設導入系統的時間,在跟其他程式交握時,可以更靈活的應用。
先前我們談論到靜態方法就像是定義工具箱一樣,那麼抽象方法就像是共用表格的概念,例如註冊帳號時會填寫的一些基本資料,就有包含制式的表格,裡面有需填寫的欄位,例如姓名,性別等。
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
在使用類別創建實例時,輸入的屬性的都要定義好資料型態,例如dog_1 = Dog("Buddy", 3),有沒有輸入一段字串讓他自己判斷的方法阿? 有的就是使用classmethod: classmethod 是一種裝飾器,它用於定義類別方法。類別方法與實例方法不同,它們被綁定到類別而不是實例。
當你想讓原本函式新增其他功能,又不想更動原本函式時,Python提供了一種強大而靈活的工具,那就是裝飾器。 但對於新手來說這個裝飾器,非常抽象難以理解,讓我們繼續往下看,慢慢的抽絲剝繭吧。 在 Python 中,使用「@」當做裝飾器使用的語法糖符號
在人與人溝通之間,最怕雞同鴨講,彼此不對頻的狀況常會造成誤會。在程式語言中也會出現類似的情況,所以就有一些約定來彼此約束。 PEP 8 是 Python 社群廣泛遵循的一種風格指南,用於提高 Python 程式碼的可讀性和一致性。一開始是 Python 之父 Guido van Rossum 自己
在Python函式中,可以使用None來指定動態的預設引數,使用更靈活,Docstrings同時能夠提供清晰的文檔。本篇文章說明利用這種方式來讓函式更彈性,輸入不同型態的關鍵字引數,並在事件紀錄時間的Log訊息的範例中詮釋,可自行輸入時間或者預設導入系統的時間,在跟其他程式交握時,可以更靈活的應用。
你可能也想看
Google News 追蹤
Thumbnail
這篇內容,將會用一個簡單的範例,來解釋物件(Object)和實體(Instance)的差別。包括Instance的簡介、ID、物件改變會影響實體。
Thumbnail
這個系列的教學會列出基本上所有常見的造型和一些基礎 , 讓各位可以自行搭配造型~在這個第二篇呢 , 我們會來一起了解: 如何定義物件出現在畫面的哪個位置有哪些指令可以定位物件如何正確定義物件一些常見的失誤那就讓我們開始吧!
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
本文介紹了各種運算符的用法和優先級,包括算術運算符、比較運算符、賦值運算符、邏輯運算符、位元運算符、成員運算符和身份運算符。每種運算符都有詳細的描述和示例程式碼,幫助理解其功能和用法。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
※ 常用Object(物件)型態的方法: 拿到object裡面某個key的value(值): 拿到所有屬性: ※ 存取物件屬性:點記法與括號記法 使用點記法 (dot notation) 或括號記法 (bracket notation) 來存取物件的值,以下兩種寫法的結果是一樣的: //
Thumbnail
撫摸着柵欄 掛上漂亮的裝飾 一些虛構的珠寶 幾乎要幻滅了 因為太多收藏品 害怕被搶奪 有時候放在梯子旁 用一條金色的線 與井口互相聯繫 有一些隱藏着的事情 眼睛只能捕捉影像 卻不能理解魔法 擁有着語言的結構 配合鞭策的氣量 產生了形狀的蛻變吧 首
Thumbnail
Python 裝飾器(Decorator),它能夠讓你在不改變原始函式的情況下,增加額外的功能。本文將介紹 Python 裝飾器(Decorator)的基本概念、實現方式,並提供實際應用範例讓你更好了解Python 裝飾器。
Thumbnail
這篇內容,將會用一個簡單的範例,來解釋物件(Object)和實體(Instance)的差別。包括Instance的簡介、ID、物件改變會影響實體。
Thumbnail
這個系列的教學會列出基本上所有常見的造型和一些基礎 , 讓各位可以自行搭配造型~在這個第二篇呢 , 我們會來一起了解: 如何定義物件出現在畫面的哪個位置有哪些指令可以定位物件如何正確定義物件一些常見的失誤那就讓我們開始吧!
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
本文介紹了各種運算符的用法和優先級,包括算術運算符、比較運算符、賦值運算符、邏輯運算符、位元運算符、成員運算符和身份運算符。每種運算符都有詳細的描述和示例程式碼,幫助理解其功能和用法。
Thumbnail
Python語法包括條件語句、迴圈、函數和變數的使用。條件語句如if、elif和else用於進行條件判斷,for和while是兩種主要的迴圈,def用於定義函數。變數可以被賦予數字或字符串,並可使用類型提示來指定變數的類型。註解可以是單行或多行,並可用於解釋函數或類的用途和作用。
※ 常用Object(物件)型態的方法: 拿到object裡面某個key的value(值): 拿到所有屬性: ※ 存取物件屬性:點記法與括號記法 使用點記法 (dot notation) 或括號記法 (bracket notation) 來存取物件的值,以下兩種寫法的結果是一樣的: //
Thumbnail
撫摸着柵欄 掛上漂亮的裝飾 一些虛構的珠寶 幾乎要幻滅了 因為太多收藏品 害怕被搶奪 有時候放在梯子旁 用一條金色的線 與井口互相聯繫 有一些隱藏着的事情 眼睛只能捕捉影像 卻不能理解魔法 擁有着語言的結構 配合鞭策的氣量 產生了形狀的蛻變吧 首
Thumbnail
Python 裝飾器(Decorator),它能夠讓你在不改變原始函式的情況下,增加額外的功能。本文將介紹 Python 裝飾器(Decorator)的基本概念、實現方式,並提供實際應用範例讓你更好了解Python 裝飾器。