這兩天學習類、屬性、方法、對象等概念,由於原來基礎比較薄弱,沒接觸過面向對象的語言,一遍看下來,徹底懵逼了。 啃了兩天,才算是不那麼懵了。簡單記錄下。 Class是一種抽象概念,比如我們定義的Class——Student,是指學生這個概念,而實例(Instance)則是一個個具體的Student,比 ...
這兩天學習類、屬性、方法、對象等概念,由於原來基礎比較薄弱,沒接觸過面向對象的語言,一遍看下來,徹底懵逼了。
啃了兩天,才算是不那麼懵了。簡單記錄下。
Class是一種抽象概念,比如我們定義的Class——Student,是指學生這個概念,而實例(Instance)則是一個個具體的Student,比如,Bart Simpson和Lisa Simpson是兩個具體的Student。
所以,面向對象的設計思想是抽象出Class,根據Class創建Instance。參考廖雪峰的官方網站Python3
類和對象主要是封裝、繼承、多態幾個知識點。
類包括屬性和方法,這是它與函數不同的地方,函數只有方法。
封裝,我的理解是將一些數據和方法隱藏在函數內部了,外部不需要知道為什麼,只要實例調用就好了。
就好像我們知道 +,既可以1 + 2,也可以‘a’+‘b’,至於為什麼,在它的內部,我們不需要知道。
繼承是指,子類繼承父類的數據和方法。
比如,我們定義了一個名為Animal的class,它有一個run()de 方法,那麼,當我們創建Dog、Cat等子類時,就可以繼承Animal的屬性和方法,不需要重覆創建。
1 >>> class Animal(object): 2 def run(self): 3 print('Animal is running...') 4 5 6 >>> class Dog(Animal): #繼承類Animal 7 pass 8 9 >>> class Cat(Animal): 10 pass
在class Dog和Cat中,我都沒有創建任何函數,接下來我創建子類的實例,並調用run():
1 >>> dog = Dog() 2 >>> cat = Cat() 3 >>> dog.run() 4 Animal is running... 5 >>> cat.run() 6 Animal is running...
子類Dog和Cat,都可以調用從父類Animal繼承的run()方法。都列印出Animal is running...
但是,如果子類中定義與父類同名的方法或屬性,則會自動覆蓋父類對應的方法或屬性。不同名,則可以新增,屬於子類。
如上面的例子,Dog肯定不希望僅僅列印出Animal。
1 >>> class Dog(Animal): 2 def rund(self): 3 print('Dog is running...') 4 5 6 >>> class Cat(Animal): 7 def run(self): 8 print('Cat is running...') 9 10 11 >>> dog = Dog() 12 >>> cat = Cat() 13 >>> dog.run() 14 Animal is running... 15 >>> dog.rund() 16 Dog is running... 17 >>> cat.run() 18 Cat is running...
這裡面,Dog類新增了方法,rund(),所以實例dog,既可以調用從父類繼承來的方法run(),輸出Animal is running,
也可以調用自己新增的方法rund(),輸出Dog is running;
而Cat類,因為新增的方法run(),與父類方法重名,所以覆蓋了父類對應的方法。所以,cat.run()輸出,Cat is running。
繼承屬性可以使用super函數或者在子類的__init__函數裡面調用父類的__init__函數。
實例:
後面添加吧。。。