[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,因為屬性已被刪除

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

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

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


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




119會員
201內容數
本業是影像辨識軟體開發,閒暇時間進修AI相關內容,將學習到的內容寫成文章分享。
留言0
查看全部
發表第一個留言支持創作者!
螃蟹_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
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
Python 提供了一個功能豐富的標準函式庫,其中 random 專門用於生成隨機數。本文將介紹 random 的基本介紹,以及函式應用。
Thumbnail
Dictionary(字典) : 是一個可以用來存放不同資料(不同型態)的容器(集合) 每一個元素都是以{鍵(Key):值(Value)}所構成,字典中每個項目都是用","隔開
Thumbnail
在如今的資訊時代,如何有效的獲取並處理數據,成為了許多專業人士和企業的重要需求,爬蟲技術,作為獲取網絡數據的重要工具,其重要性不言而喻,而這篇文章將分享Python爬蟲的基礎,讓你能獲取想要的網頁數據。
Thumbnail
Python 基本語法 python 語法的後綴名是以.py 結尾 python 執行方式 使用交互介面執行 使用 python test.py 命令執行 使用./test.py 執行 python 標示符 以單下劃線開頭的屬性,表示是類的私有屬性(包括方法,變量)。如:_foo表示不能直接訪問的類
詳細原碼: https://reurl.cc/ex8lZm hello world Variable (變數) 輸入 input() 四則運算 列表 list (陣列) 集合 字典(Dictionary) 給值 try 檢驗 取所有值 判斷式 If else 迴圈 Switch //字典方式 CSV
Thumbnail
在上一篇教學中,我們學會了如何將鉅亨網上的新聞爬取下來,並且顯示在LINE BOT中,而我們今天則來教一下如何查詢個股的一些基本資訊,以及最新的開盤價、成交價等資訊吧!!
Thumbnail
「VSCode 是世上最棒的 IDE 了吧」這時有人跳出來表示不服,定睛一看原來是那陳年的大哥 Visual Studio,他說道:「用 Windows 做開發的人一定要裝 Visual Studio 這樣專業的 IDE,不要裝其他次等的文字編輯器,才可以有效提升專業度。」
Thumbnail
在上一篇文章中,我們已經準備好製作LINE機器人的工具了,接下來我們就要來做一個最簡單的Python與LINE的串接練習,讓我們的機器人活起來,並且做出最基本的回話功能,如果還沒準備好串接所需的工具,記得先去看《【python】Python+LINE Bot 輕鬆打造股市機器人(二) : 所需準備的
Thumbnail
每當要研究投資標的時,你是否也會覺得A網站的財報資料完整,又覺得B網站的選股條件完善,又覺得C網站的新聞比較重要,有時身邊又沒有隨身攜帶筆電怎麼好查詢呢?這時可能就在想怎麼沒有人開發一個程式能完成符合我想要的功能啊~~與其求助於人,不如自己動手做最好,有相同煩惱的人,LINE Bot超適合你!!
Thumbnail
接下來第二部分我們持續討論美國總統大選如何佈局, 以及選前一週到年底的操作策略建議 分析兩位候選人政策利多/ 利空的板塊和股票
Thumbnail
🤔為什麼團長的能力是死亡筆記本? 🤔為什麼像是死亡筆記本呢? 🤨作者巧思-讓妮翁死亡合理的幾個伏筆
Thumbnail
Python 提供了一個功能豐富的標準函式庫,其中 random 專門用於生成隨機數。本文將介紹 random 的基本介紹,以及函式應用。
Thumbnail
Dictionary(字典) : 是一個可以用來存放不同資料(不同型態)的容器(集合) 每一個元素都是以{鍵(Key):值(Value)}所構成,字典中每個項目都是用","隔開
Thumbnail
在如今的資訊時代,如何有效的獲取並處理數據,成為了許多專業人士和企業的重要需求,爬蟲技術,作為獲取網絡數據的重要工具,其重要性不言而喻,而這篇文章將分享Python爬蟲的基礎,讓你能獲取想要的網頁數據。
Thumbnail
Python 基本語法 python 語法的後綴名是以.py 結尾 python 執行方式 使用交互介面執行 使用 python test.py 命令執行 使用./test.py 執行 python 標示符 以單下劃線開頭的屬性,表示是類的私有屬性(包括方法,變量)。如:_foo表示不能直接訪問的類
詳細原碼: https://reurl.cc/ex8lZm hello world Variable (變數) 輸入 input() 四則運算 列表 list (陣列) 集合 字典(Dictionary) 給值 try 檢驗 取所有值 判斷式 If else 迴圈 Switch //字典方式 CSV
Thumbnail
在上一篇教學中,我們學會了如何將鉅亨網上的新聞爬取下來,並且顯示在LINE BOT中,而我們今天則來教一下如何查詢個股的一些基本資訊,以及最新的開盤價、成交價等資訊吧!!
Thumbnail
「VSCode 是世上最棒的 IDE 了吧」這時有人跳出來表示不服,定睛一看原來是那陳年的大哥 Visual Studio,他說道:「用 Windows 做開發的人一定要裝 Visual Studio 這樣專業的 IDE,不要裝其他次等的文字編輯器,才可以有效提升專業度。」
Thumbnail
在上一篇文章中,我們已經準備好製作LINE機器人的工具了,接下來我們就要來做一個最簡單的Python與LINE的串接練習,讓我們的機器人活起來,並且做出最基本的回話功能,如果還沒準備好串接所需的工具,記得先去看《【python】Python+LINE Bot 輕鬆打造股市機器人(二) : 所需準備的
Thumbnail
每當要研究投資標的時,你是否也會覺得A網站的財報資料完整,又覺得B網站的選股條件完善,又覺得C網站的新聞比較重要,有時身邊又沒有隨身攜帶筆電怎麼好查詢呢?這時可能就在想怎麼沒有人開發一個程式能完成符合我想要的功能啊~~與其求助於人,不如自己動手做最好,有相同煩惱的人,LINE Bot超適合你!!