類(Class):用來描述具有相同的屬性和方法的對(duì)象的集合。它定義了該集合中每個(gè)對(duì)象所共有的屬性和方法洛姑。對(duì)象是類的實(shí)例凝颇。
類變量:類變量在整個(gè)實(shí)例化的對(duì)象中是公用的。類變量定義在類中且在函數(shù)體之外贪磺。類變量通常不作為實(shí)例變量使用。
數(shù)據(jù)成員:類變量或者實(shí)例變量, 用于處理類及其實(shí)例對(duì)象的相關(guān)的數(shù)據(jù)诅愚。
方法重寫:如果從父類繼承的方法不能滿足子類的需求寒锚,可以對(duì)其進(jìn)行改寫,這個(gè)過程叫方法的覆蓋(override)违孝,也稱為方法的重寫刹前。
局部變量:定義在方法中的變量,只作用于當(dāng)前實(shí)例的類雌桑。
實(shí)例變量:在類的聲明中喇喉,屬性是用變量來表示的。這種變量就稱為實(shí)例變量校坑,是在類聲明的內(nèi)部但是在類的其他成員方法之外聲明的拣技。
繼承:即一個(gè)派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個(gè)派生類的對(duì)象作為一個(gè)基類對(duì)象對(duì)待撒踪。
方法:類中定義的函數(shù)过咬。
對(duì)象:通過類定義的數(shù)據(jù)結(jié)構(gòu)實(shí)例。對(duì)象包括兩個(gè)數(shù)據(jù)成員(類變量和實(shí)例變量)和方法制妄。
創(chuàng)建類
使用 class 語句來創(chuàng)建一個(gè)新類,class 之后為類的名稱并以冒號(hào)結(jié)尾:
classClassName:'類的幫助信息'#類文檔字符串class_suite#類體
類的幫助信息可以通過ClassName.doc查看泵三。
class_suite 由類成員耕捞,方法,數(shù)據(jù)屬性組成烫幕。
self 代表類的實(shí)例俺抽,self 在定義類的方法時(shí)是必須有的,雖然在調(diào)用時(shí)不必傳入相應(yīng)的參數(shù)较曼。
self代表類的實(shí)例磷斧,而非類
類的方法與普通的函數(shù)只有一個(gè)特別的區(qū)別——它們必須有一個(gè)額外的第一個(gè)參數(shù)名稱, 按照慣例它的名稱是 self。
實(shí)例化類其他編程語言中一般用關(guān)鍵字 new,但是在 Python 中并沒有這個(gè)關(guān)鍵字弛饭,類的實(shí)例化類似函數(shù)調(diào)用方式冕末。
以下使用類的名稱 Employee 來實(shí)例化,并通過init方法接收參數(shù)侣颂。
訪問屬性
getattr(obj, name[, default]) : 訪問對(duì)象的屬性档桃。
hasattr(obj,name) : 檢查是否存在一個(gè)屬性。
setattr(obj,name,value) : 設(shè)置一個(gè)屬性憔晒。如果屬性不存在藻肄,會(huì)創(chuàng)建一個(gè)新屬性。
delattr(obj, name) : 刪除屬性拒担。
dict: 類的屬性(包含一個(gè)字典嘹屯,由類的數(shù)據(jù)屬性組成)
doc:類的文檔字符串
name: 類名
module: 類定義所在的模塊(類的全名是'main.className',如果類位于一個(gè)導(dǎo)入模塊mymod中从撼,那么className.module等于 mymod)
bases: 類的所有父類構(gòu)成元素(包含了一個(gè)由所有父類組成的元組)
python對(duì)象銷毀(垃圾回收)
Python 使用了引用計(jì)數(shù)這一簡單技術(shù)來跟蹤和回收垃圾抚垄。
在 Python 內(nèi)部記錄著所有使用中的對(duì)象各有多少引用。
一個(gè)內(nèi)部跟蹤變量谋逻,稱為一個(gè)引用計(jì)數(shù)器呆馁。
當(dāng)對(duì)象被創(chuàng)建時(shí), 就創(chuàng)建了一個(gè)引用計(jì)數(shù)毁兆, 當(dāng)這個(gè)對(duì)象不再需要時(shí)浙滤, 也就是說, 這個(gè)對(duì)象的引用計(jì)數(shù)變?yōu)? 時(shí)气堕, 它被垃圾回收纺腊。但是回收不是"立即"的, 由解釋器在適當(dāng)?shù)臅r(shí)機(jī)茎芭,將垃圾對(duì)象占用的內(nèi)存空間回收揖膜。
垃圾回收機(jī)制不僅針對(duì)引用計(jì)數(shù)為0的對(duì)象,同樣也可以處理循環(huán)引用的情況梅桩。循環(huán)引用指的是壹粟,兩個(gè)對(duì)象相互引用,但是沒有其他變量引用他們宿百。這種情況下趁仙,僅使用引用計(jì)數(shù)是不夠的。Python 的垃圾收集器實(shí)際上是一個(gè)引用計(jì)數(shù)器和一個(gè)循環(huán)垃圾收集器
類的繼承
面向?qū)ο蟮木幊處淼闹饕锰幹皇谴a的重用垦页,實(shí)現(xiàn)這種重用的方法之一是通過繼承機(jī)制雀费。
繼承語法
class派生類名(基類名)...
在python中繼承中的一些特點(diǎn):
1、如果在子類中需要父類的構(gòu)造方法就需要顯式的調(diào)用父類的構(gòu)造方法痊焊,或者不重寫父類的構(gòu)造方法盏袄。詳細(xì)說明可查看: python 子類繼承父類構(gòu)造函數(shù)說明忿峻。
2、在調(diào)用基類的方法時(shí)辕羽,需要加上基類的類名前綴逛尚,且需要帶上 self 參數(shù)變量。區(qū)別在于類中調(diào)用普通函數(shù)時(shí)并不需要帶上 self 參數(shù)
3逛漫、Python 總是首先查找對(duì)應(yīng)類型的方法黑低,如果它不能在派生類中找到對(duì)應(yīng)的方法,它才開始到基類中逐個(gè)查找酌毡。(先在本類中查找調(diào)用的方法克握,找不到才去基類中找)。
如果在繼承元組中列了一個(gè)以上的類枷踏,那么它就被稱作"多重繼承" 菩暗。
派生類的聲明,與他們的父類類似旭蠕,繼承的基類列表跟在類名之后停团,如下所示:
classSubClassName(ParentClass1[,ParentClass2,...]):...
你可以繼承多個(gè)類
方法重寫
如果父類方法的功能不能滿足需求可以在子類重寫你父類的方法:
基礎(chǔ)重載方法
下表列出了一些通用的功能,你可以在自己的類重寫:
序號(hào)方法, 描述 & 簡單的調(diào)用
1init ( self [,args...] )構(gòu)造函數(shù) 簡單的調(diào)用方法:obj = className(args)
2del( self )析構(gòu)方法, 刪除一個(gè)對(duì)象 簡單的調(diào)用方法 :del obj
3repr( self )轉(zhuǎn)化為供解釋器讀取的形式 簡單的調(diào)用方法 :repr(obj)
4str( self )用于將值轉(zhuǎn)化為適于人閱讀的形式 簡單的調(diào)用方法 :str(obj)
5cmp ( self, x )對(duì)象比較 簡單的調(diào)用方法 :cmp(obj, x)
運(yùn)算符重載
類屬性與方法
類的私有屬性
__private_attrs:兩個(gè)下劃線開頭掏熬,聲明該屬性為私有佑稠,不能在類的外部被使用或直接訪問。在類內(nèi)部的方法中使用時(shí)self.__private_attrs旗芬。
類的方法
在類的內(nèi)部舌胶,使用def關(guān)鍵字可以為類定義一個(gè)方法,與一般函數(shù)定義不同疮丛,類方法必須包含參數(shù) self,且為第一個(gè)參數(shù)
類的私有方法
__private_method:兩個(gè)下劃線開頭幔嫂,聲明該方法為私有方法,不能在類的外部調(diào)用誊薄。在類的內(nèi)部調(diào)用self.__private_methods
實(shí)例
foo: 定義的是特殊方法履恩,一般是系統(tǒng)定義名字?
_foo: 以單下劃線開頭的表示的是 protected 類型的變量,
__foo: 雙下劃線的表示的是私有類型(private)的變量, 只能是允許這個(gè)類本身進(jìn)行訪問了呢蔫。