定義類
class 類名:
賦值語句
賦值語句
.....
def語句定義函式
def語句定義函式
.....
複製程式碼
例:
class testclass:
data = 100
def setpdata(self, value):
self.data = value
def showpdata(self):
print("data:", self.data)
x = testclass()
x.setpdata(123)
x.showpdata()
print(x.data)
複製程式碼
類物件 類物件支援兩種操作:屬性引用和例項化。
- 屬性引用使用和 Python 中所有的屬性引用一樣的標準語法:obj.name。
- 類物件建立後,類名稱空間中所有的命名都是有效屬性名。
類的方法
在類的內部,使用 def 關鍵字來定義一個方法,與一般函式定義不同,類方法必須包含引數 self, 且為第一個引數,self 代表的是類的例項。
類有一個名為 __ init__() 的特殊方法(構造方法),該方法在類例項化時會自動呼叫,像下面這樣:
def __init__(self,value):
self.data = value
複製程式碼
類有一個名為 __del __() 的特殊方法(析構方法),該方法在例項物件回收時會自動呼叫,像下面這樣:
def __del__(self):
del self.data
複製程式碼
其他方法 觀察以下例子:
class test:
def add(a, b):
return a + b
def add2(self, a, b):
return a + b
#通過類物件呼叫方法
print(test.add(2, 3)) #5
print(test.add2(2, 3, 4)) #7
#建立例項物件
x = test()
print(x.add2(2, 3)) #5
print(x.add(2, 3)) #報錯
複製程式碼
- 通過類物件呼叫方法,只需要記住引數個數,add2()方法中2傳給了self,但是self並沒有使用,所以計算結果仍為7
- 如果例項化物件,物件會和引數一同傳遞給方法,add()方法只有兩個引數,所以報錯
解釋一下self
- self代表類的例項,而非類
- 類的方法與普通的函式只有一個特別的區別——它們必須有一個額外的第一個引數名稱, 按照慣例它的名稱是 self。
- 通過例項物件呼叫方法時,當前例項物件作為一個引數傳遞進去
- self 代表的是類的例項,代表當前物件的地址,而 self.class 則指向類。
- self 不是 python 關鍵字,但是預設第一個引數
- 個人認為self也就是java中的this指標
繼承
格式如下:
class 類名(父類名):
賦值語句
賦值語句
.....
def語句定義函式
def語句定義函式
.....
定義子類建構函式時注意新增:
#呼叫父類的構函
父類.__init__(self,n,a,w)
複製程式碼
Python同樣有限的支援多繼承形式。多繼承的類定義形如下例:
class 類名(父類名,父類名,父類名,父類名.....):
賦值語句
賦值語句
.....
def語句定義函式
def語句定義函式
.....
複製程式碼
- 需要注意圓括號中父類的順序,若是父類中有相同的方法名,而在子類使用時未指定,python從左至右搜尋 即方法在子類中未找到時,從左到右查詢父類中是否包含方法。
方法重寫
- 子類重寫你父類的方法
- super() 函式是用於呼叫父類(超類)的一個方法。
類屬性與方法
類的私有屬性 兩個下劃線開頭,宣告該屬性為私有,不能在類的外部被使用或直接訪問。在類內部的方法中使用時 self.屬性名。 類的私有方法 兩個下劃線開頭,宣告該方法為私有方法,只能在類的內部呼叫 ,不能在類的外部呼叫。self.方法名。
class Site:
def __init__(self, name, url):
self.name = name # public
self.__url = url # private
def who(self):
print('name : ', self.name)
print('url : ', self.__url)
def __foo(self): # 私有方法
print('這是私有方法')
def foo(self): # 公共方法
print('這是公共方法')
self.__foo()
x = Site('syc', 'www.syc.com')
x.who() # 正常輸出
x.foo() # 正常輸出
x.__foo() # 報錯
複製程式碼
Python3 中類的靜態方法、普通方法、類方法
- 靜態方法: 用 @staticmethod 裝飾的不帶 self 引數的方法叫做靜態方法,類的靜態方法可以沒有引數,可以直接使用類名呼叫。
- 普通方法: 預設有個self引數,且只能被物件呼叫。
- 類方法: 預設有個 cls 引數,可以被類和物件呼叫,需要加上 @classmethod 裝飾器。
class Classroom:
@staticmethod
def fun():
print("靜態方法")
@classmethod
def fun1(cls):
print("類方法")
def fun2(self):
print("普通方法")
if __name__ == '__main__':
x = Classroom()
Classroom.fun() #靜態方法
Classroom.fun() #靜態方法
x.fun2() #普通方法
複製程式碼
類的專有方法:
- __init __ : 建構函式,在生成物件時呼叫
- __del __ : 解構函式,釋放物件時使用
- __repr __ : 列印,轉換
- __setitem __ : 按照索引賦值
- __getitem __: 按照索引獲取值
- __len __: 獲得長度
- __cmp __: 比較運算
- __call __: 函式呼叫
- __add __: 加運算
- __sub __: 減運算
- __mul __: 乘運算
- __truediv __: 除運算
- __mod __: 求餘運算
- __pow __: 乘方