面向對象編程思想的發展歷程
面向對象程序設計技術被認為是程序設計方法學的一場實質性的革命,是程序設計方法學得一個里程碑,以上說法是毋庸置疑的。為了能夠更好的理解和應用面向對象的方法進行程序的開發和設計,我們有必要首先來了解一下面向對象程序設計的歷史和發展。
70年代末期,隨著計算機科學的發展和應用領域不斷擴大,對計算機技術的要求越來越高。結構化程序設計語言和結構化分析與設計已經無法滿足用戶需求的變化,于是人們開始尋找更先進的軟件開發方法和技術,OPP由此應運而生。OPP即面向對象的程序設計,OPP技術被認為是程序設計方法學的一場實質性的革命,是程序設計方法學的一個里程碑。OPP大大替考了軟件的開發效率,減少了軟件開發的復雜性,提高了軟件系統的可維護性、可擴展性。
實際上,“對象”和“對象的屬性”這樣的概念可以追溯到20世紀50年代初,它們首先出現于關于人工智能的早期著作中。但是出現了面向對象語言之后,面向對象思想才得到了迅速的發展。過去的幾十年中,程序設計語言對抽象機制的支持程度不斷提高:從機器語言到匯編語言,到高級語言,直到面向對象語言。匯編語言出現后,程序員就避免了直接使用0-1,而是利用符號來表示機器指令,從而更方便地編寫程序;當程序規模繼續增長的時候,出現了Fortran、C、Pascal等高級語言,這些高級語言使得編寫復雜的程序變得容易,程序員們可以更好地對付日益增加的復雜性。但是,如果軟件系統達到一定規模,即使應用結構化程序設計方法,局勢仍將變得不可控制。作為一種降低復雜性的工具,面向對象語言產生了,面向對象程序設計也隨之產生。
面向對象的特征——封裝的意義和過程
封裝的意義
封裝就是將對象敏感的數據封裝在類的內部,為了保護自己數據的安全性,和程序的健壯性,不讓外界直接訪問,而是通過當前類提供的set/get方法間接訪問數據,此時就可以在set/get中添加限制條件進行訪問數據的控制。
封裝實現的步驟:
1.定義類型,封裝零散數據【抽象的屬性】
2.[使用__slots__屬性,限制當前類的屬性列表à為了代碼的統一性]
3.所有屬性私有化【屬性使用雙下劃綫開頭,外界就不能直接訪問這樣的屬性了】
4.給每個屬性提供set/get方法,在方法中添加限制條件
下面看實現過程:
高級封裝
在面向對象中還有一種進階版的封裝方法,它就是使用@property,@get_method.setter注解,來注釋set/get方法,隱藏set/get方法的實現,讓方法的使用方式和屬性一致大大的提高了程序的安全性。
偽方法重載:python中,默認不提供方法重載,但是在高級封裝的過程中,又出現了類似方法重載的代碼語法,所以~稱之為偽方法重載。
對方法的封裝
在封裝的過程中,除了封裝私有屬性,還可以針對一些底層的操作方法進行私有化,將方法封裝在類的內部,通過提供的一個公共方法來控制該方法的訪問權限
面向對象的特征——繼承的意義和操作過程
在面向對象中,繼承,就是一個類型繼承另一個類型,當前類型就會擁有另一個類型的公共的屬性和方法,達到代碼的重復使用的目的。
繼承的語法如下:
class類型(被繼承的類型):
? ? ?pass
程序執行結果是:
? ? ? ? 凱特吃飯了,吃的是..烤魚..
? ? ? ? 行走中...
? ? ? ? 霸王龍吃飯了,吃的是..烤全豹..
? ? ? ? 暴走中...
在這里恐龍類繼承了動物類,就擁有了他的公共方法的使用權限,在執行了吃飯的方法之后同樣輸出了結果。
繼承中出現的術語:
? ? 父類:被繼承的類,也稱為基類、超類
? ?子類:當前類,也稱為派生類
? ?子類繼承父類,體現的是A is a B的關系
? ?子類繼承父類,就可以使用父類中所有的公開的屬性和方法
繼承鏈
? ?A繼承B,B繼承C,C繼承D
? ?A直接繼承了B,間接繼承了C,D;
? ?此時A創建的對象,可以同時使用B,C,D中所有公開的屬性和方法
此時程序執行的結果是:
? ?吃飯
? ?游戲中...
? ?休息休息
多繼承
? ? python中,一個類型,可以同時繼承多個類型,同時擁有所有繼承類型的所有公開的屬性和方法
備注:在進行代碼設計的過程中,可能會出現多繼承,所以盡量不要在父類中定義相同名稱的屬性或者方法
備注2:如果父類中出現了相同名稱的屬性和方法,在使用的時候子類調用時會優先繼承優先調用。
下面是代碼的實現過程:
程序的執行結果是:
? ?尊師重道
? ?尊老愛幼
? ? 吃美食...
(<class '__main__.User' >, <class '__main__.Son' >, <class '__main__.Student' >, <class '__main__.Person' >, <class 'object' >)
最后括號里面的內容就是屬性和方法的搜索過程。
方法重寫:
? 子類在自己類中重新定義父類中已經存在的方法,在執行該方法時,如果子類中沒有重寫就直接調用父類的方法,如果子類重寫了該方法,就直接調用子類重寫的方法!
擴展:子類中,訪問父類的屬性和方法:
? ? classUser(Person):
? ? def__init__(self, name, age):
#直接通過父類的類名稱調用父類的屬性和方法
? ? Person.__init__(name, age)
#通過super()來調用父類的屬性和方法
? ? super().__init__(name, age)
面向對象——多態
?多態:程序在運行的過程中,根據執行條件的不同,動態執行不同的操作代碼的過程稱為程序運行時多態。
?多態操作,通常情況和繼承相關聯
下面我們使用一段代碼來帶體驗多態:
此時程序執行的結果是:
手術......
[王先生]康復了,當前健康值60
輸液......
[李夫人]死鬼,終于康復了...
輸液......
李先生哇咔咔,康復了
不好意思,請出門左轉,哪里是獸醫院
這里我們的代碼就是:用不同的對象在程序運行是,以不同的角色,執行了一樣的代碼。
此時我們可能對多態還不是太了解,到這里,我們就沒必要再講了,我們只需要知道他的概念,在以后大量的代碼練習中,自然而然就會理解這局話了。
?