python的描述符就是乙個類,只不過這個類描述了類中的屬性和方法,這裡不做過多的介紹。
大家知道,我們既可以聽過類名.屬性的方式修改類的屬性,也可以通過物件名.屬性的方式修改類的屬性,但是考慮到python中使用類的主要是為了封裝的作用,而由於類名.屬性容易破壞類的封裝,因此為了使用類名.屬性的方式同時也不損壞類的封裝原則,python提供了property函式。
property() 函式,可以實現在不破壞類封裝原則的前提下,讓開發者依舊使用「類物件.屬性」的方式操作類中的屬性。
property() 函式的基本使用格式為:屬性名=property(fget=none, fset=none, fdel=none, doc=none)。
其中,fget 引數用於指定獲取該屬性值的類方法,fset 引數用於指定設定該屬性值的方法,fdel 引數用於指定刪除該屬性值的方法,最後的 doc 是乙個文件字串,用於提供說明此函式的作用。我們在呼叫 property() 函式時,可以傳入 0 個(既不能讀,也不能寫的屬性)、1 個(唯讀屬性)、2 個(讀寫屬性)、3 個(讀寫屬性,也可刪除)和 4 個(讀寫屬性,也可刪除,包含文件說明)引數。
例子:
@此程式例子**於python教程
class rectangle:
# 定義構造方法
def __init__(self, width, height):
self.width = width
self.height = height
# 定義setsize()函式
def setsize (self , size):
self.width, self.height = size
# 定義getsize()函式
def getsize (self):
return self.width, self.height
# 定義delsize()函式
def delsize (self):
self.width, self.height = 0, 0
# 使用property定義屬性
size = property(getsize, setsize, delsize, '用於描述矩形大小的屬性')
# 訪問size屬性的說明文件
print(rectangle.size.__doc__)
# 通過內建的help()函式檢視rectangle.size的說明文件
help(rectangle.size)
rect = rectangle(4, 3)
# 訪問rect的size屬性
print(rect.size) # (4, 3)
# 對rect的size屬性賦值
rect.size = 9, 7
# 訪問rect的width、height例項變數
print(rect.width) # 9
print(rect.height) # 7
# 刪除rect的size屬性
del rect.size
# 訪問rect的width、height例項變數
print(rect.width) # 0
print(rect.height) # 0
程式中,使用 property() 函式定義了乙個 size 屬性,在定義該屬性時一共傳入了 4 個引數,這意味著該屬性可讀、可寫、可刪除,也有說明文件。所以,該程式嘗試對 rectangle 物件的 size 屬性進行讀、寫、刪除操作,其實這種讀、寫、刪除操作分別被委託給 getsize()、setsize() 和 delsize() 方法來實現。
1、既要保護類的封裝特性,又要讓開發者可以使用「物件.屬性」的方式操作操作類屬性,除了使用 property() 函式,還可以使用 @property 裝飾器。通過 @property 裝飾器,可以直接通過方法名來訪問方法,不需要在方法名後新增一對「()」小括號。
其語法格式如下:
@property
def 方法名(self)
**塊例1:
@此例子**於python教程
class rect:
def __init__(self,area):
self.__area = area
@property
def area(self):
return self.__area
rect = rect(30)
#直接通過方法名來訪問 area 方法
print("矩形的面積是:",rect.area)
2、但是,上述的@property並不能對屬性修改和賦值。因此,要想實現修改 area 屬性的值,還需要為 area 屬性新增 setter 方法,就需要用到 setter 裝飾器,其語法格式如下:
@方法名.setter
def 方法名(self, value):
**塊例2:
@area.setter
def area(self, value):
self.__area = value
3、除此之外,還可以使用 deleter 裝飾器來刪除指定屬性,其語法格式為:
@方法名.deleter
def 方法名(self):
**塊例:3:
@area.deleter
def area(self):
self.__area = 0
注:本文中的部分****於python教程: 類和物件高階
建構函式是類中的特殊成員函式。建構函式的作用是完成物件的初始化。給出類定義時,由程式設計師編寫建構函式。如果程式設計師沒有編寫類的任何建構函式,則由系統自動新增乙個不帶引數的建構函式。建構函式在類體裡的宣告形式 類名 形參1,形參2,形參n 也可沒有形參 建構函式的定義形式 假設資料成員為x1,x2...
物件導向高階一
通過字串的形式操作物件相關的屬性 四個可以實現自省的函式 hasattr getattr setattr delattr class people country china def init self,name self.name name p people spring print p.dict...
Python物件導向高階程式設計 使用列舉類
當我們需要定義常量時,乙個辦法是用大寫變數通過整數來定義,例如 月份 一月 jan 1 二月 feb 2 三月 mar 3 四月 apr 4 五月 may 5 六月 jun 6 七月 jul 7 八月 aug 8 九月 sep 9 十月 oct 10 十一月 nov 11 十二月 dec 12 好處...