python學習手冊25OOP:巨集偉藍圖

天飛.h發表於2016-02-28

點選(此處)摺疊或開啟

  1. #!/usr/bin/env python
  2. #* coding:utf8 *
  3. #OOP:巨集偉藍圖
  4. #類是python實現支援繼承的新種類的物件的部件。類是python物件導向程式設計(OOP)的主要工具。OOP提供一種不同尋常而更有效的檢查程式的方式,利用這種設計方法,我們分解程式碼,把程式碼的冗餘度降至最低,並且勇冠定製現有的程式碼來編寫新的程式,而不是在原處修改。
  5. #類使用class語句創立。
  6. #類就是一些函式的包,這些函式大量使用並處理內建物件型別。
  7. #類的設計是為了建立並管理新的物件,並且他們也支援繼承。這是一種程式碼定製與複用的機制。
  8. #為何使用類?
  9.     #繼承:通用屬性。
  10.     #組合:元件的集合,每個元件都可以寫成類,定義自己的行為及關係。
  11. #類是python程式的組成單元,就像函式和模組一樣:類是封裝邏輯和資料的一種方式。
  12.     #類的獨特之處:
  13.         #1.多重例項。程式是人,一個類是頭,手等,每個人的頭手都不同。
  14.         #2.通過繼承進行定製。可在類的外部擴充其屬性。
  15.         #3.運算子過載。通過提供特定協議方法,類可以定義物件來響應內建型別上的幾種運算。
  16. `
  17. 概覽OOP
  18. (類(超類-子類)-例項)-類物件-例項物件-屬性-類物件樹
  19.     屬性繼承搜尋(搜尋類物件樹)
  20.         object.attribute 找出attribute首次出現的地方,先搜尋object,然後是此物件上的所有類,由下至上,由左至右。取出屬性,就是搜尋樹。我們稱這種搜尋程式為繼承,因為樹中位置較低的物件繼承了樹中位置較高的物件所擁有的屬性。
  21.             python通過‘爬樹’的方式搜尋屬性。(類與通過類產生的例項是兩種不同的物件型別。)
  22.             類是一種產生例項的工廠。從類產生的例項都繼承該類的屬性。
  23.             例項:代表程式領域中的具體元素。
  24.             樹中子類重新定義超類的屬性,這類重新定義就是OOP中軟體定製的重點。
  25.     類和例項
  26.         類與模組的差異:記憶體中特定模組只是一個例項,我們需要過載模組以取得其新程式碼,但是,對類而言,只要有需要,製作多少例項都可以。
  27.             從操作的角度來說,類通常都有函式,而例項有其它基本的資料項,類的函式中使用了這些資料。
  28.             在OOP中,例項就像是帶有資料的記錄,而類是處理這些記錄的程式。
  29.     類方法呼叫(附屬於類的函式屬性)
  30.         當我們呼叫附屬於類的函式時,總會隱含著這個類的例項,當運算執行時,總是有個主體物件。I2.W()呼叫對映為C3.W(I2)
  31.         員工類-員工例項-加薪(方法)
  32.         self是把隱含例項傳入方法的一個特殊引數。
  33.         方法能通過例項(bob.giveraise())或類(Employee.giveraise(bob))進行呼叫。
  34.     編寫類樹
  35.         1.每個class語句都會生成一個新的類物件
  36.         2.每次類呼叫時,都會生成一個新的例項物件
  37.         3.例項自動連線至建立了這些例項的類。
  38.         4.類連線至基超類的方式是,將超類列在類頭部的括號內。其從左至右的順序會決定樹中的次序。
  39.         C2(.X,.Z) C3(.W,.Z)
  40.               C1(.X,.Y)
  41.         I1(.NAME( I2(.NAME)
  42.         class C2: …#建立C2類
  43.         class C3: …#建立C3類
  44.         class C1(C2, C3): … #建立C1類,連結超類從左到右是C2,C3,使用多重繼承,即超過一個以上的超類
  45.         I1=C1() #呼叫C1建立例項,連結到他們的類
  46.         I2=C1()
  47.         附加在例項上的屬性只屬於例項,附加在類上的屬性由所有子類及其例項共享。
  48.         1.屬性通常是在class語句中通過賦值語句新增在類中,而不是嵌入在函式的def語句內。
  49.         2.屬性通常在類內,對傳給函式的特殊引數(也就是self),做賦值運算而新增在例項中的。
  50.             類通過函式為例項提供行為。
  51.         class C1(C2,C3): #建立C1並連線超類C2,C3
  52.             def setname(self,who) #附加方法C1.setname
  53.                 self.name=who #self 是例項I1,I2其實任何一個。
  54.         I1=C1() #建立2個例項I1,I2
  55.         I2=C1()
  56.         I1.setname(`bob`) #I1.name 賦值bob
  57.         I2.setname(`mel`) #I2.name 賦值mel
  58.         print(I1.name)
  59. OOP是為了程式碼重用
  60.     大體而言,OOP就是在樹中搜尋屬性。
  61.     通過類,我們可以定製現有的軟體來編寫程式碼,而不是對現有程式碼在原處修改。
  62.     從基本的角度,類就是由函式和其它變數名所構成的包,很像模組。然而,我們從類得到了自動屬性繼承搜尋,支援了軟體的高層次定製,而這是我們勇冠函式,模組做不到的。此外,類提供了自然的結構,讓程式碼可以把邏輯和變數名區域化,有助於程式除錯。
  63.     一量習慣了類這種方式進行程式設計,會發現,當要寫新程式時,很多工作已經做好了。你的任務大部分就是把已經實現的程式所需行為的現有超類混合起來。
  64.     事實上,在很多應用領域,你可以取得或購買超類集合,也就是所謂的軟體框架(framework),把常用程式設計任務實現成類,可以在應用程式中混合。
  65.         利用軟體框架,只要編寫子類,填入所需的一兩個方法。樹中較高位置的框架類會做絕大多數的工作。
  66.         在OOP中寫程式,就是編寫自己的子類,結合和定製已經除錯的程式碼。
  67.         程式設計師將常見的OOP結構歸類,稱為設計模式。
  68. `
  69. class C2:
  70.     pass
  71. class C3:
  72.     pass
  73. #self是用來儲存兩個例項之一的內部變數名: self自動引用正在處理的例項。
  74. class C1(C2,C3): #建立C1並連線超類C2,C3
  75.     def setname(self,who): #附加方法C1.setname
  76.         self.name=who #self 是例項I1,I2其實任何一個。
  77. I1=C1() #建立2個例項I1,I2
  78. I2=C1()
  79. I1.setname(`bob`) #I1.name 賦值bob self=I1 #不先進行呼叫會報錯AttributeError: C1 instance has no attribute `name`
  80. I2.setname(`mel`) #I2.name 賦值mel self=I2
  81. print(I1.name)
  82. #事實上呼叫I1.setname前引用I1.name會產生未定義變數名的錯誤。如果類想確保像name這樣的變數名一定會在其例項中設定,通常會構造時填寫好這個屬性。
  83. #__init__也叫建構函式
  84. class C1(C2,C3):
  85.     def __init__(self,who): #每次產生例項,python會自動呼叫名為__init__的方法。其效果是在建立例項時初始化了這個例項,而不需要額外的呼叫。
  86.         self.name=who
  87. I1=C1(`talen`)
  88. print(I1.name)

點選(此處)摺疊或開啟

  1. /usr/bin/python2.7 /home/talen/PycharmProjects/untitled/t25.py
  2. bob
  3. talen
  4. Process finished with exit code 0


相關文章