我們在以前的一篇圖文 Python基礎(chǔ) -- Task10. 類與對象 中介紹過利用property()
方法既能保護(hù)類的封裝特性,又能讓開發(fā)者可以使用“對象.屬性”的方式操作類屬性。
class property([fget[, fset[, fdel[, doc]]]])
用于在新式類中返回屬性值。
- fget -- 獲取屬性值的函數(shù)
- fset -- 設(shè)置屬性值的函數(shù)
- fdel -- 刪除屬性值函數(shù)
- doc -- 屬性描述信息
并在圖文 Python魔法方法之屬性訪問詳解 中詳細(xì)介紹了property()
方法的實(shí)現(xiàn)機(jī)理。
除了使用property()
方法外,Python還提供了屬性裝飾器。通過這些屬性裝飾器,可以直接利用方法名來訪問方法,不需要在方法名后添加一對“()”小括號。
@property
def 方法名(self)
代碼塊
@方法名.setter
def 方法名(self, value):
代碼塊
@方法名.deleter
def 方法名(self):
代碼塊
1. Python屬性裝飾器舉例
class People:
def __init__(self, name, age):
self.__name = name
self.__age = age if age > 0 else 0
@property
def age(self):
return self.__age
@age.setter
def age(self, age):
if isinstance(age, int):
self.__age = age if age > 0 else 0
else:
raise ValueError
@age.deleter
def age(self):
print('刪除年齡數(shù)據(jù)!')
obj = People('jack', 18)
print(obj.age) # 獲取值
obj.age = 19 # 重新賦值
print('obj.age:', obj.age)
del obj.age # 刪除屬性
# 18
# obj.age: 19
# 刪除年齡數(shù)據(jù)!
@property
裝飾器上例中的第一個age(self)
方法,這樣就使得該方法變成了age
屬性的getter
方法。需要注意的是,如果類中只包含該方法,那么age
屬性將是一個只讀屬性。
@xxx.setter
裝飾器
上例中的第二個age(self, age)
方法,這樣就使得該方法變成了age
屬性的setter
方法,提供賦值功能。
@xxx.delete
裝飾器
上例子中第三個age(self)
方法,這樣就使得該方法變成了age
屬性的deleter
方法,用于刪除功能。
2. 使用property()
函數(shù)
class People:
def __init__(self, name, age):
self.__name = name
self.__age = age if age > 0 else 0
def get_age(self):
return self.__age
def set_age(self, age):
if isinstance(age, int):
self.__age = age if age > 0 else 0
else:
raise ValueError
def del_age(self):
print("刪除年齡數(shù)據(jù)!")
age = property(get_age, set_age, del_age, "年齡")
obj = People('jack', 18)
print(obj.age)
obj.age = 19
print('obj.age:', obj.age)
del obj.age
# 18
# obj.age: 19
# 刪除年齡數(shù)據(jù)!
本圖文介紹了Python中三種屬性裝飾器,并通過案例演示了這三種屬性裝飾器的使用方法,并利用property()
方法實(shí)現(xiàn)了相同的功能。今天就到這里吧!See You!
參考文獻(xiàn)
http://c.biancheng.net/view/4561.html
http://www.liujiangblog.com/course/python/