標籤:類的方法 回收 dash 屬性 mod 成員 參數 衍生類別 編程
python大法好——物件導向
Python從設計之初就已經是一門物件導向的語言,正因為如此,在Python中建立一個類和對象是很容易的。本章節我們將詳細介紹Python的物件導向編程。
如果你以前沒有接觸過物件導向的程式設計語言,那你可能需要先瞭解一些物件導向語言的一些基本特徵,在頭腦裡頭形成一個基本的物件導向的概念,這樣有助於你更容易的學習Python的物件導向編程。
接下來我們先來簡單的瞭解下物件導向的一些基本特徵。
物件導向技術簡介
- 類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的執行個體。
- 類變數:類變數在整個執行個體化的對象中是公用的。類變數定義在類中且在函數體之外。類變數通常不作為執行個體變數使用。
- 資料成員:類變數或者執行個體變數, 用於處理類及其執行個體對象的相關的資料。
- 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。
- 執行個體變數:定義在方法中的變數,只作用於當前執行個體的類。
- 繼承:即一個衍生類別(derived class)繼承基類(base class)的欄位和方法。繼承也允許把一個衍生類別的對象作為一個基類對象對待。例如,有這樣一個設計:一個Dog類型的對象派生自Animal類,這是類比"是一個(is-a)"關係(例圖,Dog是一個Animal)。
- 執行個體化:建立一個類的執行個體,類的具體對象。
- 方法:類中定義的函數。
- 對象:通過類定義的資料結構執行個體。對象包括兩個資料成員(類變數和執行個體變數)和方法。
建立類
使用 class 語句來建立一個新類,class 之後為類的名稱並以冒號結尾:
class ClassName: ‘類的協助資訊‘ #類文檔字串 class_suite #類體
類的協助資訊可以通過ClassName.__doc__查看。
class_suite 由類成員,方法,資料屬性群組成。
執行個體
以下是一個簡單的 Python 類的例子:
class Employee: ‘所有員工的基類‘ empCount = 0 def __init__(self, name, salary): self.name = name self.salary = salary Employee.empCount += 1 def displayCount(self): print "Total Employee %d" % Employee.empCount def displayEmployee(self): print "Name : ", self.name, ", Salary: ", self.salary
empCount 變數是一個類變數,它的值將在這個類的所有執行個體之間共用。你可以在內部類或外部類使用 Employee.empCount 訪問。
第一種方法__init__()方法是一種特殊的方法,被稱為類的建構函式或初始化方法,當建立了這個類的執行個體時就會調用該方法
self 代表類的執行個體,self 在定義類的方法時是必須有的,雖然在調用時不必傳入相應的參數。
self代表類的執行個體,而非類
類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是 self。
class Test: def prt(self): print(self) print(self.__class__) t = Test()t.prt()
建立執行個體對象
執行個體化類其他程式設計語言中一般用關鍵字 new,但是在 Python 中並沒有這個關鍵字,類的執行個體化類似函數調用方式。
以下使用類的名稱 Employee 來執行個體化,並通過 __init__ 方法接收參數。
"建立 Employee 類的第一個對象"emp1 = Employee("Zara", 2000)"建立 Employee 類的第二個對象"emp2 = Employee("Manni", 5000)訪問屬性
您可以使用點號 . 來訪問對象的屬性。使用如下類的名稱訪問類變數:
emp1.displayEmployee()emp2.displayEmployee()print "Total Employee %d" % Employee.empCount
Python內建類屬性
- __dict__ : 類的屬性(包含一個字典,由類的資料屬性群組成)
- __doc__ :類的文檔字串
- __name__: 類名
- __module__: 類定義所在的模組(類的全名是‘__main__.className‘,如果類位於一個匯入模組mymod中,那麼className.__module__ 等於 mymod)
__bases__ : 類的所有父類構成元素(包含了一個由所有父類組成的元組)
python對象銷毀(記憶體回收)
Python 使用了引用計數這一簡單技術來跟蹤和回收垃圾。
在 Python 內部記錄著所有使用中的對象各有多少引用。
一個內部跟蹤變數,稱為一個引用計數器。
當對象被建立時, 就建立了一個引用計數, 當這個對象不再需要時, 也就是說, 這個對象的引用計數變為0 時, 它被記憶體回收。但是回收不是"立即"的, 由解譯器在適當的時機,將垃圾對象佔用的記憶體空間回收。
記憶體回收機制不僅針對引用計數為0的對象,同樣也可以處理循環參考的情況。循環參考指的是,兩個對象相互引用,但是沒有其他變數引用他們。這種情況下,僅使用引用計數是不夠的。Python 的垃圾收集器實際上是一個引用計數器和一個迴圈垃圾收集器。作為引用計數的補充, 垃圾收集器也會留心被分配的總量很大(及未通過引用計數銷毀的那些)的對象。 在這種情況下, 解譯器會暫停下來, 試圖清理所有未引用的迴圈。
class Point: def __init__( self, x=0, y=0): self.x = x self.y = y def __del__(self): class_name = self.__class__.__name__ print class_name, "銷毀" pt1 = Point()pt2 = pt1pt3 = pt1print id(pt1), id(pt2), id(pt3) # 列印對象的iddel pt1del pt2del pt3
未完待續
python大法好——物件導向