2018年4月19日筆記
- 類的概念與聲明
類(class):用來描述具有相同屬性和方法的對象的集合。
一個類定義了該集合中每個對象所共有的屬性和方法。
對象是類的實例(instance)。
聲明一個類的一般形式如下:
class ClassName(object):
def funName(self):
pass
一個類時,需註意以下幾點:
- 類名首字母大寫,類中函數(即方法)名首字母小寫
- object是所有類的父類(superclass),默認所有類都繼承object
- object不是必填項,但建議要寫上object,可避免一些不必要的報錯
- 類中函數默認第一個參數為self(必填項)
- self代表類的實例,而非類
- 類中變量(即屬性)都要以self.xxx的形式來聲明和使用
- 類中函數(即方法)也要以self.xxx的形式來調用
- 類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是 self
- self 不是 python 關鍵字,我們把self換成xxx也是可以正常執行的
- 類的構造器
定義:類在實例化時,首先必須要執行的函數。
__init__()方法是一種特殊的方法,被稱為類的構造函數或初始化方法,當創建了這個類的實例時就會調用該方法
- 例1:用一個類來描述車,該類有3個屬性分別為制造商、型號、生產年份,用2個方法分別來設置和獲取車輛屬性
- 類的繼承
派生類DerivedClass:即子類
基類BaseClass:即父類
子類聲明的一般形式如下:
class DerivedClassName(BaseClassName):
pass
當子類和父類不在同一個模塊中時,子類的聲明如下:
class DerivedClassName(modname.BaseClassName):
pass
多繼承時,子類的聲明如下:
class DerivedClass(BaseClass1, BaseClass2, BaseClass3, ...)
pass
使用繼承時,強調以下幾點:
- 子類存在與父類同名的方法時,則調用子類的方法
- 多繼承時,多個父類有同名方法且在子類中未聲明該方法時,python從左至右搜索 即方法在子類中未找到時,從左到右查找父類中是否包含方法,所以要特別註意圓括號中父類的順序
- 使用super可以在子類中重寫父類的方法,也可實現子類對象調用父類已被覆蓋的方法
- 類的私有屬性與私有方法
__privateAttr:兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問。在類內部的方法中使用時 self.__privateAttr
__privateMethod:兩個下劃線開頭,聲明該方法為私有方法,只能在類的內部調用 ,不能在類地外部調用。self.__privateMethod
- 例2:電動車是車的子類,電動車有1個特有屬性為電池容量(私有屬性)
- 拓展知識:如何在類外訪問類的私有屬性?
Python為了保證不能再class之外訪問該變量,Python會在類的內部自動的把你定義的__spam變量的名字替換成為 _classname__spam(註意,classname前面是一個下劃線,spam前是兩個下劃線),Python把這種技術叫做“name mangling”。因此,用戶在外部訪問__spam的時候就會提示找不到相應的變量。
但是,這並不是意味著我們真的就不能夠從外部訪問這個變量了,上面說Python在類的內部用_classname__spam替換了__spam,
因此,我們可以在類的外面使用_classname__spam來訪問__spam。
- 例3:在例2的基礎上,在類外直接訪問類的私有屬性——電池容量
2018年4月19日筆記