一.python的面向?qū)ο缶幊?/h2>
? ? ? ? 在java 里,萬物皆對象入问,不再考慮程序的執(zhí)行具體過程丹锹,而把對象作為基本單元,一個對象包含了數(shù)據(jù)(屬性)和操作數(shù)據(jù)的函數(shù)(方法)芬失,數(shù)據(jù)封裝楣黍、繼承和多態(tài)是面向?qū)ο蟮娜筇攸c
1.1 類和實例
python 中的類通過class關鍵字定義
1.2訪問限制
? ? ? ? 在Class內(nèi)部,可以有屬性和方法棱烂,而外部代碼可以通過直接調(diào)用實例變量的方法來操作數(shù)據(jù)租漂,這樣,就隱藏了內(nèi)部的復雜邏輯颊糜。要讓內(nèi)部屬性不被外部訪問哩治,可以把屬性的名稱前加上兩個下劃線__,在Python中衬鱼,實例的變量名如果以__開頭锚扎,就變成了一個私有變量(private),只有內(nèi)部可以訪問馁启,外部不能訪問,所以,我們把Student類改一改:
1.3 繼承和多態(tài)
? 1.3.1 繼承
? ? ? ? 當我們定義一個class的時候惯疙,可以從某個現(xiàn)有的class繼承翠勉,新的class稱為子類(Subclass),而被繼承的class稱為基類霉颠、父類或超類(Base class对碌、Super class),繼承的好處:1>.子類獲得了父類的全部功能
? ? ? ? ? ? ? ? ? ? ? 2>.子類可以覆蓋父類的方法,(也就是改進父類的方法蒿偎,也就是多態(tài))
1.3.2 多態(tài)
? ? ? ? 當我們定義一個class的時候朽们,我們實際上就定義了一種數(shù)據(jù)類型。我們定義的數(shù)據(jù)類型和Python自帶的數(shù)據(jù)類型诉位,比如str骑脱、list、dict沒什么兩樣苍糠,判斷一個變量是否是某個類型可以用isinstance()判斷
1.4 使用__slots__
? ? ? ? Python允許在定義class的時候叁丧,定義一個特殊的__slots__變量,來限制該class實例能添加的屬性,在子類中也定義__slots__岳瞭,這樣拥娄,子類實例允許定義的屬性就是自身的__slots__加上父類的__slots__。
1.5 多重繼承
MixIn 設計:在設計類的繼承關系時瞳筏,通常稚瘾,主線都是單一繼承下來的,例如姚炕,Ostrich繼承自Bird摊欠。但是,如果需要“混入”額外的功能钻心,通過多重繼承就可以實現(xiàn)凄硼,比如,讓Ostrich除了繼承自Bird外捷沸,再同時繼承Runnable摊沉。這種設計通常稱之為MixIn,這樣一來痒给,我們不需要復雜而龐大的繼承鏈说墨,只要選擇組合不同的類的功能,就可以快速構造出所需的子類苍柏。
1.6 定制類
? ? ? ? 看到類似__slots__這種形如__xxx__的變量或者函數(shù)名就要注意尼斧,這些在Python中是有特殊用途的。__slots__我們已經(jīng)知道怎么用了试吁,__len__()方法我們也知道是為了能讓class作用于len()函數(shù)棺棵。除此之外楼咳,Python的class中還有許多這樣有特殊用途的函數(shù),可以幫助我們定制類
1.6.1? __str__ : ?定義__str__()方法烛恤,返回一個好看的字符串
1.6.2 __iter__ :如果一個類想被用于for ... in循環(huán)母怜,類似list或tuple那樣,就必須實現(xiàn)一個__iter__()方法缚柏,該方法返回一個迭代對象苹熏,然后,Python的for循環(huán)就會不斷調(diào)用該迭代對象的__next__()方法拿到循環(huán)的下一個值币喧,直到遇到StopIteration錯誤時退出循環(huán)
1.6.3 __getattr__ :我們調(diào)用類的方法或?qū)傩詴r轨域,如果不存在,就會報錯
1.6.4. __call__ :任何類杀餐,只需要定義一個__call__()方法干发,就可以直接對實例進行調(diào)用
1.7 使用枚舉
精確地控制枚舉類型挚赊,可以從Enum派生出自定義類