python类和oop基础知识
文章目錄
- oop:面向對象程序設計
- python類的特點:
- oop基本概念:
- 1.屬性繼承搜索:
- 2.類和實例:
- 3.類方法調用
- 4.編寫類樹
- 5.代碼重用
oop:面向對象程序設計
1.類:一些函數的包,這些函數大量使用并處理內置對象類型。
2.類的設計是為了創建和管理新的對象。類是定義新種類東西的方式。
3.通過類來實現一個對象,也就意味著建立對象實際結構和關系的模型。
4.繼承:學生屬于人,學生擁有一般人的屬性,在oop術語里面,學生繼承了人的通用屬性,這些通用屬性只需實現一次,就能在我們創建所有種類人的時候使用。
5.組合:組合就是組件的集合。學生是一個組合的實例,學生類里面還包含其他對象,比如學習。每個組件都可以寫成類,定義自己的行為和關系,學習可以寫成一個學習類。
6.對于GUI系統:寫成圖形組件的集合(按鈕,標簽)可以稱為接口,繪制圖形組件的容器時,圖形組件也跟著繪制,這是一種組合。我們編寫定制的圖形組件(有獨特顏色形狀的按鈕或標簽),可以通過接口的繼承機制實現。
python類的特點:
1多重實例:類是產生對象的工廠,每調用一個類,就產生一個獨有命名空間的新對象。這個對象能夠讀取類的屬性,并可以用自己的命名空間來存儲數據,而且不同對象數據也不同。
2通過繼承進行定制:在類的外部重新定義其屬性從而擴充這個類。
3運算符重載:類可以定義對象來響應在內置類型上的幾種運算。
oop基本概念:
1.屬性繼承搜索:
object.attribute(對象.屬性)
這個表達式,會在python中啟動搜索,去搜索一個種種對象連接的樹,尋找attribute首次出現的對象,找到之后停止搜索。先搜索object,然后是該對象之上的所有類,從下到上,從左到右。
下面這個例子:c1c2c3為類對象,l1,l2為實例對象。
c2:x,zc1:x,yc3:w,zl1:namel2:name1.就搜索樹來看,實例從他的類繼承屬性,類是從搜索樹中所有比他更上層的類中繼承屬性。
2.超類提供了所有子類共享的行為,但因為搜索由下而上,子類可能在樹中較低位置重新定義超類變量名,覆蓋超類的定義。
3.比如l2.w的搜索順序:l2,c1,c2,c3,也就是說,l2從c3繼承了屬性w
l1.x搜索順序:l1,c1
l1.name搜索順序:l1
如果說找不到某一屬性,比如:l1.k,此時發生錯誤。
2.類和實例:
類通常都有函數,而實例有一些數據項,類的函數使用了這些數據。實例像是帶有數據的記錄,類是處理這些記錄的數據。
3.類方法調用
調用類函數的時候,總會有一個主體對象,這個主體就是類的實例。python把隱含的實例傳進方法中。方法能夠通過實例或類進行調用。jack.givemoney()同于employee.givemoney(jack)。
l2.w()的意思是調用c3.w處理l2,l2.w()同于c3.w(l2)
4.編寫類樹
每個class對象會生成一個新對象。
每次類調用時,會生成新的實例對象。
實例自動連接至創建這些實例的類。
類連接至其超類的方式,將超類列在類頭部的括號內,其從左至右的順序會決定樹中的次序。(在類樹中,class語句小括號內有一個以上超類,他們從左至右的次序決定超類搜索的順序)
上面的圖可以表示成:
#創建三個類對象 class C2:#省略具體內容 class c3: #省略 class C1(c2,c3):#省略 #創建兩個實例對象 l1=c1() l2=c2()附加在實例上的屬性只屬于那些實例,而附加在類上的屬性,由所有子類及其實例共享。如c1和l1
python把隱含的實例傳進方法中第一個特殊的參數,習慣稱之為self。
class c1(c2,c3):def setname(self,who):self.name=who l1=c1() l1.setname('jack') print(l1.name)類通過函數為實例提供行為,上面例子,l1傳入self里,指明了類處理的實例是l1,然后通過類里面的函數def對self做賦值運算,把屬性添加到類對象之中。self用來存儲實例內部變量名。
對于類來說:屬性通常是在class語句中通過賦值語句添加在類中,而不是通過def函數。
對于實例來說:屬性通常是在類內,對傳給def函數的特殊參數(self),做賦值運算,而添加在實例中。
通過構造函數,創建實例時初始化實例。
上述代碼,在setname方法調用前,c1不會把name屬性附加在實例上,那么在調用l1.setname前引用l1.name會產生未定義變量名的錯誤。如果類要確保name變量名一定會在實例中被設置,通常在構造時就填好這個屬性。
class c1(c2,c3):def _init_(self,who):self.name=who l1=c1('jack') print(l1.name)每次從類產生實例時,python會自動調用名為_init_的方法,它也稱之為構造函數。新實例傳入self參數,類調用小括號內的任何值成為第二個及以后的參數。
5.代碼重用
通過類,我們可以定制現有的軟件來編寫代碼,而不是對現有代碼進行原處修改,或者每個項目都從頭開始。自動屬性繼承搜索,軟件定制,這些是通過模塊和函數做不到的。
方法只有特殊第一參數self的函數,我門可以把要處理的對象傳給簡單函數,模擬其行為。方法參與了類的繼承,我們可以通過定義新方法編寫子類,而不用原處修改代碼。
class employee:def computesalary(self):#省略內容def giveraise(self):#省略def promote(self):#省略def retire(self):#省略employee是一個通用的超類,定義所有員工默認的通用行為。
class engineer(employee):def computesalary(self):#省略這里engineer繼承了employee,是他的一個子類,這里我們重載了computesalary方法,實現了定制的目的。這個engineer類型的員工的其他行為會繼承employee里面的行為。
之所以說定制,是因為這里的computesalary在employee的下面。所以類樹搜索時搜到他就截止。
jack=employee() kk=engineer()我們可以對樹中任何類創建實例,創建的實例所用的類,會決定其屬性搜索從哪個層次開始。
company=[jack,kk] for emp in company:print(emp.computesalary())兩個實例對象,可以嵌入到一個更大的容器對象里,從而可以代表一個部門
這個for里面也用到了多態,隱藏了接口的差異性。
多態還可以用到下面:
處理數據流的程序,可以寫成預期有輸入和輸出方法的對象,而不用關心那些方法實際做的是什么
def processor(reader,converter,writer):while 1:data = reader.read()if not data:breakdata=converter(data)writer.write(data) class reader:def read(self):#省略def other(self):#省略 class filereader(reader):def read(self):#省略 class socketreader(reader):def read(self):#省略 #...省略...processor(filereader(...),converter,filewriter(...)) processor(ftpreader(...),converter,xmlwriter(...))所謂框架,就是把常見程序設計成類,讓你可以編寫一些子類,寫一兩個方法,樹中較高位置的框架類會替你做大多數工作。
總結
以上是生活随笔為你收集整理的python类和oop基础知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sata接口 图解 定义_SATA协议简
- 下一篇: python和php合成,Python照