我發現我不適合看視訊學習,看書看文字覺得更舒服,看大神的部落格教程:Python快速教程——這是大神的第一篇部落格,點選下一篇,一篇篇看下去,都很通俗易懂,坐看看大神是如何成長的,可以利用碎片時間看,收穫很多,不再迷茫。
另外,下面的評論也很有乾貨,值得認真看看,也會有收穫。
需要注意的是,大神用的是Python2.x,而我用的是python3.6,部分程式碼可能會有區別,但思想是一脈相承的,這個有些評論裡有提到的。
主要通過這裡的部落格學習的:Python基礎08 物件導向的基本概念 以及 Python基礎09 物件導向的進一步擴充。
Python使用類(class)和物件(object),進行物件導向(object-oriented programming,簡稱OOP)的程式設計。物件導向的最主要目的是提高程式的重複使用性。Python的整個概念是基於物件的。瞭解OOP是進一步學習Python的關鍵。下面是對物件導向的一種理解,基於分類。
相近物件,歸為類
在人類認知中,會根據 屬性相近 把東西 歸類 ,並給類命名。比如鳥類,其共同屬性有:有羽毛,卵生等。
物件導向就是模擬了以上人類認知過程。上面的‘東西’,在python中就稱為物件(object)。
下面貼程式碼:
""" 定義一個類別class,就是鳥類Bird。在隸屬於這個類比的語句塊中,定義了兩個變數,一個是有羽毛have_feather,一個是生殖方式way_of_reproduction,這兩個變數就是鳥類Bird的屬性attribute """ class Bird(object): have_feather = True way_of_reproduction = `egg` """ 建立y一個物件,小雞summer,類別鳥中的一個物件,summer就有了鳥類的屬性,對屬性的引用是通過 物件.屬性 object.attribute 的形式實現的 """ summer = Bird() print(summer.have_feather, summer.way_of_reproduction)
日常認知中,我們在通過屬性識別類別的時候,有時根據這個東西能做什麼事情來區分類別。比如說,鳥會移動。這樣,鳥就和房屋的類別區分開了。這些動作會帶來一定的結果,比如移動導致位置的變化。
這樣的一些“行為”屬性為方法(method)。Python中通過在類的內部定義函式,來說明方法。
"""
重新定義鳥這個類別,新增一個方法屬性,就是表示移動的方法move,它的引數中有一個self,它是為了方便我們引用物件自身。方法的第一個引數必須是self,無論是否用到。
另外兩個引數,dx, dy表示在x、y兩個方向移動的距離。move方法會最終返回運算過的position。在最後呼叫move方法的時候,我們只傳遞了dx和dy兩個引數,不需要傳遞self引數(因為self只是為了內部使用)。
"""
class Bird(object): have_feather = True way_of_reproduction = `egg` def move(self, dx, dy): position = [0,0] position[0] = position[0] + dx position[1] = position[1] + dy return position summer = Bird() print(`after move:`,summer.move(5,8))
子類
類別本身還可以進一步細分成子類,比如鳥類可以進一步分為雞,大雁,黃鸝等。
在OOP物件導向程式設計中,可以通過 繼承(inheritance) 來表達上述概念:
class Chicken(Bird): way_of_move = `walk` possible_in_KFC = True class Oriole(Bird): way_of_move = `fly` possible_in_KFC = False summer = Chicken() print(summer.have_feather) print(summer.move(5,8))
新定義的雞Chicken類的,增加了兩個屬性:移動方式way_of_move,可能在KFC找到possible_in_KFC
在類定義時,括號裡為Bird。這說明,Chicken是屬於鳥類Bird的一個子類,即Chicken 繼承 自Bird。自然而然,Bird就是Chicken的父類。Chicken將享有Bird的所有屬性。儘管只宣告瞭summer是雞類,但它通過繼承享有了父類的屬性(無論是變數屬性have_feather還是方法屬性move)
新定義的黃鸝Oriole類,同樣繼承自鳥類。在建立一個黃鸝物件時,該物件自動擁有鳥類的屬性。
通過繼承製度,可以減少程式中的重複資訊和重複語句。如果分別定義兩個類,而不繼承自鳥類,就必須把鳥類的屬性分別輸入到雞類和黃鸝類的定義中。整個過程會變得繁瑣,因此,物件導向提高了程式的可重複使用性。
定義鳥類時括號中的object,當括號中為object時,說明這個類沒有父類,到頭了,可以把object也看作是一個類,它也有(類的)屬性和方法,可以為子類所繼承
將各種各樣的東西分類,從而瞭解世界,從人類祖先開始,我們就在練習了這個認知過程,物件導向是符合人類思維習慣的。所謂程式導向,也就是執行完一個語句再執行下一個,更多的是機器思維。通過物件導向的程式設計,我們可以更方便的表達思維中的複雜想法。
呼叫類的其它資訊
在定義方法時,必須有self這一引數。這個參數列示某一物件,物件擁有類的所有性質,可以通過self,呼叫類屬性。似乎使用在定義類內部方法的時候,類似函式的形參,是這樣嗎?
class Human(object): laugh = `hahahaha` def show_laugh(self): print(self.laugh) def laugh_100th(self): for i in range(100): self.show_laugh() li_lei = Human() li_lei.laugh_100th()
這裡有一個類屬性laugh。在方法show_laugh()中,通過self.laugh,呼叫了該屬性的值。還可以用相同的方式呼叫其它方法。方法show_laugh(),在方法laugh_100th中()被呼叫。
通過物件可以修改類屬性值。但這是危險的。類屬性被所有同一類及其子類的物件共享。類屬性值的改變會影響所有的物件。
__init__()方法
__init__()是一個特殊方法(special method)。Python有一些特殊方法。Python會特殊的對待它們。特殊方法的特點是名字前後有兩個下劃線。如果你在類中定義了__init__()這個方法,建立物件時,Python會自動呼叫 這個方法。這個過程也叫初始化。
class happyBird(Bird): def __init__(self,more_words): print(`We are happy birds.`,more_words) summer = happyBird(`Happy!Happy!`)
# 執行結果
# We are happy birds. Happy!Happy!
我們看到,儘管我們只是建立了summer物件,但__init__()方法被自動呼叫了。最後一行的語句(summer = happyBird…)先建立了物件,然後執行:
summer.__init__(more_words)
`Happy!Happy!` 被傳遞給了__init__()的引數more_words
物件的性質
上面講到了許多屬性,但這些屬性是類的屬性。所有屬於該類的物件會共享這些屬性。比如說,鳥都有羽毛,雞都不會飛。
在一些情況下,定義物件的性質,用於記錄該物件的特別資訊。比如說,人這個類。性別是某個人的一個性質,不是所有的人類都是男,或者都是女。這個性質的值隨著物件的不同而不同。李雷是人類的一個物件,性別是男;韓美美也是人類的一個物件,性別是女。
當定義類的方法時,必須要傳遞一個self的引數。這個引數指代的就是類的一個物件。我們可以通過操縱self,來修改某個物件的性質。比如用類來新建一個物件,即下面例子中的li_lei, 那麼li_lei就被self表示。我們通過賦值給self.attribute,給li_lei這一物件增加一些性質,比如說性別的男女。self會傳遞給各個方法。在方法內部,可以通過引用self.attribute,查詢或修改物件的性質。
這樣,在類屬性的之外,又給每個物件增添了各自特色的性質,從而能描述多樣的世界。
class Human(object): def __init__(self, input_gender): self.gender = input_gender def printGender(self): print(self.gender) li_lei = Human(`male`) # 這裡,`male`作為引數傳遞給__init__()方法的input_gender變數。 print(li_lei.gender) li_lei.printGender()
# 執行結果
# male
# male
在初始化中,將引數input_gender,賦值給物件的性質,即self.gender。
li_lei擁有了物件性質gender。gender不是一個類屬性。Python在建立了li_lei這一物件之後,使用li_lei.gender這一物件性質,專門儲存屬於物件li_lei的特有資訊。
物件的性質也可以被其它方法呼叫,呼叫方法與類屬性的呼叫相似,正如在printGender()方法中的呼叫。
總結
嗯,多做總結是個好習慣!!!佩服大神
將東西根據屬性歸類 -> 將object歸為class
方法也是一種屬性,如動作
用繼承來說明父類-子類關係,子類自動具有父類的所有屬性。
self代表了根據類定義而建立的物件。
建立一個物件:物件名 = 類名()
引用物件屬性:object.attribute
通過self呼叫類屬性
__init__():在建立物件時自動執行
類屬性與物件屬性,即與物件的性質的區別
最後回過頭來看看,一切皆物件,“Everything is Object”。
Python基礎10 反過頭來看看,就這樣吧!