Python——物件導向

yucheng1998發表於2019-08-04

定義類

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 __: 乘方

相關文章