Python 類和物件(高階一)

2021-09-26 16:20:01 字數 2732 閱讀 3681

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 好處...