python學習(六):物件導向__python

來源:互聯網
上載者:User
物件導向與面向過程 物件導向編程——Object Oriented Programming,簡稱OOP,是一種程式設計思想。OOP把對象作為程式的基本單元,一個對象包含了資料和操作資料的函數。物件導向的程式設計把電腦程式視為一組對象的集合,而每個對象都可以接收其他對象發過來的訊息,並處理這些訊息,電腦程式的執行就是一系列訊息在各個對象之間傳遞。給對象發訊息實際上就是調用對象對應的關聯函數,我們稱之為對象的方法(Method)。物件導向的設計思想是抽象出Class,根據Class建立Instance。物件導向的抽象程度又比函數要高,因為一個Class既包含資料,又包含操作資料的方法。 面向過程的程式設計把電腦程式視為一系列的命令集合,即一組函數的順序執行。為了簡化程式設計,面向過程把函數繼續切分為子函數,即把大塊函數通過切割成小塊函數來降低系統的複雜度。 對象與執行個體 物件導向最重要的概念就是類(Class)和執行個體(Instance),必須牢記類是抽象的模板,而執行個體是根據類建立出來的一個個具體的“對象”,每個對象都擁有相同的方法,但各自的資料可能不同。 可以自由地給一個執行個體變數綁定屬性;由於類可以起到模板的作用,因此,可以在建立執行個體的時候,把一些我們認為必須綁定的屬性強制填寫進去,通過定義一個特殊的 init方法,在建立執行個體的時候,就把屬性綁上去。有了 init方法,在建立執行個體的時候,就不能傳入空的參數了,必須傳入與 init方法匹配的參數,但self不需要傳,Python解譯器自己會把執行個體變數傳進去。和普通的函數相比,在類中定義的函數只有一點不同,就是第一個參數永遠是執行個體變數self,並且,調用時,不用傳遞該參數。除此之外,類的方法和普通函數沒有什麼區別,所以,你仍然可以用預設參數、可變參數、關鍵字參數和命名關鍵字參數。 小結 類是建立執行個體的模板,而執行個體則是一個一個具體的對象,各個執行個體擁有的資料都互相獨立,互不影響; 方法就是與執行個體綁定的函數,和普通函數不同,方法可以直接存取執行個體的資料; 通過在執行個體上調用方法,我們就直接操作了對象內部的資料,但無需知道方法內部的實現細節。 和靜態語言不同,Python允許對執行個體變數綁定任何資料,也就是說,對於兩個執行個體變數,雖然它們都是同一個類的不同執行個體,但擁有的變數名稱都可能不同。 訪問限制 在Python中,執行個體的變數名如果以__(雙底線)開頭,就變成了一個私人變數(private),只有內部可以訪問,外部不能訪問。這樣就確保了外部代碼不能隨意修改對象內部的狀態,這樣通過訪問限制的保護,代碼更加健壯。 在Python中,變數名類似 xxx的,也就是以雙底線開頭,並且以雙底線結尾的,是特殊變數,特殊變數是可以直接存取的,不是private變數,所以定義變數時,最好不要以 variable這樣形式定義類屬性。 有時你會看到以一個底線開頭的執行個體變數名,比如_name(一個底線),這樣的執行個體變數外部是可以訪問的,但是,按照約定俗成的規定,當你看到這樣的變數時,意思就是,“雖然我可以被訪問,但是,請把我視為私人變數,不要隨意訪問”。 雙底線開頭的執行個體變數是不是一定不能從外部存取呢。其實也不是。比如Student類和屬性__name,不能直接存取__name,是因為Python解譯器對外把__name變數改成了_Student__name,所以,仍然可以通過後者來訪問__name變數。但是強烈建議你不要這麼幹,因為不同版本的Python解譯器可能會把__name改成不同的變數名。 總的來說就是,Python本身沒有任何機制阻止你幹壞事,一切全靠自覺。 封裝

物件導向程式設計中的術語對象(Object)基本上可以看做資料(特性)以及由一系列可以存取、操作這些資料的方法所組成的集合。傳統意義上的“程式=資料結構+演算法”被封裝”掩蓋“並簡化為“程式=對象+訊息”。對象是類的執行個體,類的抽象則需要經過封裝。封裝可以讓調用者不用關心對象是如何構建的而直接進行使用。 繼承與多態 在OOP程式設計中,當我們定義一個class的時候,可以從某個現有的class繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。繼承有什麼好處。最大的好處是子類獲得了父類的全部功能,繼承的第二個好處需要我們對代碼做一點改進。本質上,繼承使代碼重用功能最大化。 多態:意味著變數並不知道引用的對象是什麼,根據引用對象的不同表現不同的行為方式。在處理多態對象時,只需要關注它的介面即可。這就是著名的“開閉”原則:對擴充開放,即允許增加新的子類;對修改封閉,即需要修改介面的方法。 鴨子類型 鴨子類型是動態類型的一種風格。在這種風格中,一個對象有效語義,不是由繼承自特定的類或實現特定的介面,而是由”當前方法和屬性的集合”決定。這個概念的名字來源於由James Whitcomb Riley提出的鴨子測試,“鴨子測試”可以這樣表述:“當看到一隻鳥走起來像鴨子、遊泳起來像鴨子、叫起來也像鴨子,那麼這隻鳥就可以被稱為鴨子。python中的鴨子類型允許我們使用任何提供所需方法的對象,而不需要迫使它成為一個子類。 態類型語言的物件導向設計中,鴨子類型的概念至關重要。 利用鴨子類型的思想,我們不必藉助超類型的協助,就能輕鬆地在動態類型語言中實現一個原則:“面向介面編程,而不是面向實現編程” 。 因為任何提供正確介面的對象都可以在python中交替使用,它減少了多態的一般超類的需求。繼承仍然可以用來共用代碼,但是如果所有被共用的都是公用介面,鴨子類型就是所有所需的。這減少了繼承的需要,同時也減少了多重繼承的需要;通常,當多重繼承似乎是一個有效方案的時候,我們只需要使用鴨子類型去類比多個超類之一(定義和那個超類一樣的介面和實現)就可以了。 動態語言的鴨子類型特點決定了繼承不像靜態語言那樣是必須的。 執行個體屬性 vs 類屬性 執行個體屬性:給執行個體綁定屬性的方法是通過執行個體變數,或者通過self變數; 類屬性:如果類本身需要綁定一個屬性呢。可以直接在class中定義屬性,這種屬性是類屬性,歸類所有;當我們定義了一個類屬性後,這個屬性雖然歸類所有,但類的所有執行個體都可以訪問到。 在編寫程式的時候,千萬不要把執行個體屬性和類屬性使用相同的名字,因為相同名稱的執行個體屬性將屏蔽掉類屬性,但是當你刪除執行個體屬性後,再使用相同的名稱,訪問到的將是類屬性。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.