分裝 繼承 多態【不同對象對同一方法響應不同行動】
類對象支持兩種操作:屬性引用和實例化
屬性引用 使用和 Python 中所有的屬性引用一樣的標準語法:類對象名.屬性名
類對象創建后,類命名空間中所有的命名都是有效屬性名。所以如果類定義是這樣:
?
以上創建了一個新的類實例并將該對象賦給局部變量 x,x 為空的對象
執行以上程序輸出結果為:
MyClass 類的屬性 i 為: 12345
MyClass 類的方法 f 輸出為: hello world
?
類有一個名為 __init__() 的特殊方法(構造方法),該方法在類實例化時會自動調用,像下面這樣:
類定義了 __init__() 方法,類的實例化操作會自動調用 __init__() 方法。如下實例化類 MyClass,對應的 __init__() 方法就會被調用:
x = MyClass()
當然, __init__() 方法可以有參數,參數通過 __init__() 傳遞到類的實例化操作上。例如:
self代表類的實例,而非類
類的方法與普通的函數只有一個特別的區別——它們必須有一個額外的第一個參數名稱, 按照慣例它的名稱是 self。
以上實例執行結果為:
<__main__.Test instance at 0x100771878>
__main__.Test
從執行結果可以很明顯的看出,self 代表的是類的實例,代表當前對象的地址,而 self.class 則指向類
?
self 不是 python 關鍵字,我們把他換成xxx 也是可以正常執行的:
以上實例執行結果為:
<__main__.Test instance at 0x100771878>
__main__.Test
在類的內部,使用 def 關鍵字來定義一個方法,與一般函數定義不同,類方法必須包含參數 self, 且為第一個參數,self 代表的是類的實例?
class people:
??? #定義基本屬性
??? name = ''
??? age = 0
??? #定義私有屬性,私有屬性在類外部無法直接進行訪問
??? __weight = 0
??? #定義構造方法
??? def __init__(self,n,a,w):
??????? self.name = n
??????? self.age = a
??????? self.__weight = w
??? def speak(self):
??????? print("%s 說: 我 %d 歲。" %(self.name,self.age))
# 實例化類
p = people('jike',10,30) ? ? 【類的實例化操作會自動調用 __init__() 方法】
p.speak()
執行以上程序輸出結果為:
jike 說: 我 10 歲。
需要注意圓括號中父類的順序,若是基類中有相同的方法名,而在子類使用時未指定,python從左至右搜索
即方法在子類中未找到時,從左到右查找基類中是否包含方法。
?
父類必須與派生類定義在一個作用域內。類定義在另一個模塊中時還可以用表達式
class 派生類名(模塊名.父類名):
?舉例
?
執行以上程序輸出結果為:
ken 說: 我 10 歲了,我在讀 3 年級
多繼承
需要注意圓括號中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python從左至右搜索
即方法在子類中未找到時,從左到右查找父類中是否包含方法。
輸出:
我叫 Tim,我是一個演說家,我演講的主題是 Python
?
?
方法重寫

?
類的私有屬性【不能在外部調用】
__private_attrs:兩個下劃線開頭,聲明該屬性為私有,不能在類的外部被使用或直接訪問。在類內部的方法中使用時 self.__private_attrs。
類的方法
在類的內部,使用 def 關鍵字來定義一個方法,與一般函數定義不同,類方法必須包含參數 self,且為第一個參數,self 代表的是類的實例。
self 的名字并不是規定死的,也可以使用 this,但是最好還是按照約定是用 self。
類的私有方法【不能在外部調用】
__private_method:兩個下劃線開頭,聲明該方法為私有方法,只能在類的內部調用 ,不能在類的外部調用。self.__private_methods。
類的專有方法:
- __init__ : 構造函數,在生成對象時調用
- __del__ : 析構函數,釋放對象時使用
- __repr__ : 打印,轉換
- __setitem__ : 按照索引賦值
- __getitem__: 按照索引獲取值
- __len__: 獲得長度
- __cmp__: 比較運算
- __call__: 函數調用
- __add__: 加運算
- __sub__: 減運算
- __mul__: 乘運算
- __truediv__: 除運算
- __mod__: 求余運算
- __pow__: 乘方
?
# 各種運算符重載
反向運算符重載:
- __radd__:?加運算
- __rsub__:?減運算
- __rmul__:?乘運算
- __rdiv__:?除運算
- __rmod__:?求余運算
- __rpow__:?乘方
復合重載運算符:
- __iadd__:?加運算
- __isub__:?減運算
- __imul__:?乘運算
- __idiv__:?除運算
- __imod__:?求余運算
- __ipow__:?乘方

#?關于 __name__

#?類的靜態方法、普通方法、類方法

?
?
如果子類定義與父類同名的方法或屬性,會自動覆蓋父類的方法或屬性
1.調用未綁定的父類方法
該重寫方法第一行: 父類名.xxxx(self ---將子類對象傳入)
2.使用super函數
super().父類方法名() ---不需要給定任何父類的名字,自動一層層找出
可以重寫此方法自定義初始化操作