Python中的類提供了面向對象程式設計的所有基本功能:類的繼承機制允許多個基類,派生類可以覆寫基類中的任何方法,方法中可以調用基類中的同名方法。
對象可以包含任意數量和類型的資料。
1.類對象
類對象支援兩種操作:屬性引用和執行個體化。
屬性引用使用和 Python 中所有的屬性引用一樣的标準文法:obj.name。
類對象建立後,類命名空間中所有的命名都是有效屬性名。
是以如果類定義是這樣:
class Myclass:
i=123
def pzl(self):
return 'Hello World'
x=Myclass()#執行個體化
print(x.i)
print(x.pzl())
#輸出:
123
Hello World
None
2.類的方法
在類地内部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,
class Myclass:
n=0 #基本屬性
__w='private' #私有屬性
def __init__(self,ta,tb):
self.a=ta
self.b=tb
def pzl(self,tc):
return self.a+self.b+tc
x=Myclass(3,4)
x.n=5
print(x.pzl(5))
print(x.n)
print(x._w) #不可引用報錯
#輸出:
12
5
Traceback (most recent call last):
File "E:/PycharmProjects/test1/test1.py", line 15, in <module>
print(x._w)
AttributeError: 'Myclass' object has no attribute '_w'
- 方法中的這個self參數,就是對調用該方法(method)的執行個體對象(instance)的一個引用(reference)。就是self.x的值為這個執行個體類的内部變量,内部函數都可以使用
- 外部輸入的值如果想要整個執行個體類都可以用的就要用self指派
- 類定義了 init() 方法的話,類的執行個體化操作會自動調用 init() 方法
- __w 私有屬性,外部不可以通路
3.繼承
所有類都預設從object繼承,
MyClass.__bases__
檢視MyClass類的父類
import os,sys
class Myclass:
n=0 #基本屬性
__w='private' #私有屬性
def __init__(self,ta,tb):
self.a=ta
self.b=tb
def pzl(self,tc): #相加a,b,c
return self.a+self.b+self.tc
def speak(self): #相加a,b
return self.a+self.b
class Son_Myclass(Myclass):
def __init__(self,ta,tb,tc):
Myclass.__init__(self,ta,tb)
self.c=tc
def pzl(self): #子類重寫,相加a,b,c
return self.a+self.b+self.c
x=Son_Myclass(3,4,5) #實作3,4,5相加用繼承類
print(x.pzl())
print(x.speak()) #繼承類繼承了父類的speak即使自己并沒有speak函數
#輸出
12
7
4.多繼承
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
需要注意圓括号中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python從左至右搜尋 即方法在子類中未找到時,從左到右查找父類中是否包含方法。
5.類屬性與方法
類的私有屬性
__private_attrs:兩個下劃線開頭,聲明該屬性為私有,不能在類地外部被使用或直接通路。在類内部的方法中使用時self.__private_attrs。
類的方法
在類地内部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,且為第一個參數
類的私有方法
__private_method:兩個下劃線開頭,聲明該方法為私有方法,不能在類地外部調用。在類的内部調用 slef.__private_methods。
- init : 構造函數,在生成對象時調用
- del : 析構函數,釋放對象時使用
- repr : 列印,轉換
- setitem : 按照索引指派
- getitem: 按照索引擷取值
- len: 獲得長度
- cmp: 比較運算
- call: 函數調用
- add: 加運算
- sub: 減運算
- mul: 乘運算
- div: 除運算
- mod: 求餘運算
- pow: 乘方
6.運算符重載
class Vector:
def __init__(self, a, b):
self.a = a
self.b = b
def __str__(self):
return '%d'%(self.a+self.b)
def __add__(self, other):
return Vector(self.a + other.a, self.b + other.b)
v1 = Vector(2, 2)
v2 = Vector(1, 1)
print(v1 + v2)
#輸出
6