標籤:自己的 標識 經典 type 精準 類的變數 類型 learn 通過
一 物件導向編程與面向過程編程1 面向過程編程思想
該思想核心是過程,指的是解決問題的步驟,即先幹什麼然後幹什麼,就像流水線一樣,必須一步一步來,基於面向過程編程的是一種機械化的思維方式。
優點: 複雜問題流程化,簡單化;
缺點:可擴充性較差。
應用情境:一旦完成幾乎不會改變,像Linux核心、git以及Apache HTTP Server等
2 物件導向編程思想
隨著硬體的快速發展,業務需求越來越複雜,以及編程應用領域越來越廣泛,面向過程編程已經不能滿足需求了,於是另一種編程思想開始興起,就是物件導向編程。
該思想核心是對象,對象是特徵與技能的結合體,基於物件導向設計程式就好比自己是造物主一樣,想要創造什麼就創造什麼,與面向過程機式的思維方式形成鮮明對比,物件導向更加註重對現實世界的抽象化。
優點:解決了程式的擴充性。對某一個對象單獨修改,會立刻反應到整個體系中。
缺點:1. 編程的複雜度高於面向過程編程,不瞭解物件導向而立即上手基於對象設計程式,容易出現過度設計的問題。一些擴充性要求低的情境使用物件導向會增加編程難度。
- 無法向面向過程的程式設計流水式的可以很精準的預測問題的處理流程與結果,物件導向的程式一旦開始就由對象之間的互動解決問題。
應用情境:需求經常變化的軟體,一般需求的變化都集中在使用者層,互連網應用,企業內部軟體,遊戲等
物件導向的程式設計並不是全部。對於一個軟體品質來說,,物件導向的程式設計只是用來解決擴充性。
一個好的應用軟體應包括的特性:
二 類與對象一 類的定義
類即類別、種類,是物件導向設計最重要的概念,對象是特徵與技能的結合體,而類則是一系列具有相似特徵與技能的抽象概念。
在現實中是先出現對象,然後根據一系列具有相同特徵的對象定義不同的類,對象是具體的存在,而類僅僅只是一個概念,並不真實存在。
在程式中是先定義類,然後根據類產生對象,這與函數的使用是類似的,先定義函數,類同理,在程式中需要先定義類,後調用類,與函數不一樣的是,調用函數會執行函數體代碼返回的是函數的執行結果,而調用類會產生並返回一個對象。
在程式中,務必保證,先定義類,後使用對象。
- 在程式中特徵使用變數標識,技能使用函數標識。
- 因而類中最常見的是:變數和函數的定義。
# 定義一個類class something: school = ‘hashangda‘ def learn(self): print(‘something is learning‘) def eat(self): print(‘something is eating‘) def sleep(self): print(‘something is sleeping‘)
注意:
- 類中可以為任意python代碼,這些代碼在類定義階段便會執行;
- 因而會產生新的名稱空間,用來存放類的變數名與函數名,可以通過something._dict_查看;
- 對於經典類來說可以通過該字典操作類名稱空間的名字(新式類有限制),但python為我們提供了專門的文法進行訪問;
- 點事訪問屬性的文法,類中定義的名字,都是類的屬性(變數和函數).
二 程式中類的用法
在程式中用.來訪問類的屬性,本質操作為_dict_
something.school # 等於經典類 something.__dict__[‘school‘]something.school = ‘oldboy‘ # 等於經典類 something.__dict__[‘school‘] = ‘oldboy‘something.name = ‘musibii‘ # 等於經典類 something.__dict__[‘name‘] = ‘musibii‘del something.name # 等於經典類 something.__dict__.pop(‘name‘)
在程式中調用類(執行個體化對象),產生並返回一個對象,產生的對象會具有類裡面的屬性,並且可以通過句點法進行訪問.
總結:
- 類本質是一個名稱空間,或者說是一個用來存放變數與函數的容器;
- 類的用途之一就是當做名稱空間從其內部取出名字來使用;
- 類的主要用途是調用類產生對象.
三 對象的使用
通過調用類產生的對象成為類的執行個體化,調用類的傳回值稱之為類的一個對象/執行個體.
some = something() # 產生一個執行個體對象,對象可以通過句點法訪問類中的屬性()print(some.school)# 結果 hashangda
類中定義的屬性是由該類產生的所有對象共有的屬性,那麼每個對象自己特有的屬性應該怎麼定義的?
class something: school = ‘hashangda‘ def __init__(self, name, age, gender): self.name = name self.age = age self.gender = gender
類中的init方法是用來初始化一個執行個體對象的,並且會執行下面的代碼,所以這時候要執行個體化對象是需要傳入後面的參數.
some1 = something(‘musibii‘, 18, ‘male‘)some2 = something(‘thales‘, 20, ‘female‘)some3 = something(‘maffia‘, 22, ‘male‘)
這樣執行個體化出來的對象除了school屬性值一樣,其他都是自己專屬的屬性值.
調用類產生了
- 先產生一個Null 物件some1,然後返回;
- 觸發類中函數init的執行,將對象聯通調用類括弧內指定的參數一同傳入init.
總結:init的功能,在執行個體化時為對象初始化自己專屬的特徵(不能有傳回值)
四 屬性尋找
屬性尋找和之前學的名稱空間尋找順序邏輯一樣,首先在對象的名稱空間裡面尋找,沒有的話去類名稱空間尋找,但是不會去全域名稱空間尋找對象的屬性.
類中定義的變數是所有對象共用的,對象可以使用,類也可以使用,類一旦改變自己的屬性的值,所有的對象也會隨之改變.
五 Binder 方法
類中定義的變數是類的資料屬性,類和對象都可以使用,並且屬性的值都指向一個記憶體位址;
類中定義的函數是類的函數屬性,類和對象都可以調用,類來調用的就是一個普通的函數,但類中定義的函數都是用來給對象用的,而且是綁定給對象的.
- 類的函數:該傳幾個參數就傳幾個
- Binder 方法,指向類的函數:特殊之處是綁定給哪個對象就應該由哪個對象來調用,調用的時候就會把對象本身當做第一個參數自動傳入.
六 一切皆對象
在python3中統一了類和類型的概念,就是說一個類等於一種類型,比如python中的資料類型,我們也可以定義屬於自己的類
class muSibii: passmusibii = muSibii()print(type(musibii))# 結果 <class ‘__main__.muSibii‘>
物件導向編程