Python雖然語法簡單,通俗易懂,但是再簡單它也是一門語言,就像一棵大樹,總有一些樹枝是彎彎繞繞的,讓新手看完之后一臉懵逼,今天我們就來說說這幾個點,反正我學的時候是很困惑的!
01.函式里面的 *args
1).可變引數
這個是什么鬼,尤其是有其他c,c++語言基礎的人,看到這個點,一定懵逼了,難道是指標,兩個**又是什么鬼?
其實這個Python里面的函式入參的幾種形式,假如你來設計一個語言,一個函式fun(),里面要傳引數進來,要考慮擴展性:變數會有很多種形態,有可能是變數,也可能是陣列,也可能是結構體,或者是哈希陣列,
比如你有一個累加功能的函式:

每次呼叫函式都要傳一個串列或者元組進去,非常死板,不靈活,如果我要傳多個串列,多個變數,我又不想改介面,但是改成下面這樣就靈活很多: 在這里順便說下不管你是為了Python就業還是興趣愛好,記住:專案經驗永遠是核心,如果你缺新專案練習,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新教程專案,還可以跟老司機交流討教!

*args:表示可變引數,就是傳入的引數個數是可變的,可以是1個、2個到任意個或者0個,其實就是把一堆引數當作一個陣列(Python串列或者元組傳遞進來),
02.關鍵字引數 **kwargs
關鍵字引數可以讓你輸入0或者多個含引數名的引數,并且自動組裝為一個字典

你函式的介面設定為**kwargs,這樣的好處,一個是靈活,擴展性好,也就是說我預留的了擴展的介面,你程式呼叫的時候可以根據自己的需求傳1個,多個或者不傳都可以,
另外:不用太糾集args和kwargs這些英語單詞,只是大家約定這么叫而已
03.臉萌的@property
有其他經驗的程式員,看到這個奇奇怪怪的@加一個關鍵字,一定是一臉懵逼,這其實是Python類里面的一些封裝,這些都是類的內置裝飾器,有一些特殊的用途!
1).裝飾器@property
我們大部分人都比較熟悉比如Java的get/set方法,比如:

小編推薦一個學Python的學習裙【 二二七,四三五,四五零 】,無論你是大牛還是小白,是想轉行還是想入行都可以來了解一起進步一起學習!裙內有開發工具,很多干貨和技術資料分享!希望新手少走彎路
2).但是這樣寫比較麻煩,需要通過函式get/set 來訪問屬性
有木有直接對屬性進行操作的同時就可以對屬性進行處理,比如我們呼叫student.score=88,這一個時候會自動呼叫set_score函式,這樣就非常靈活和簡便!
Python里面為了簡潔和優雅,設計了@property

對于外邊訪問的屬性score,我們通過Python類中的property裝飾器對它進行升級,改造,讓它能變的更加靈活和強大!
其實它就是系結了一些方法(fget,fset和fdel).尤其是你對屬性進行升級功能而不改變外邊代碼的時候,這一招就非常有用!
04.傻傻分不清@classmethod和@staticmethod
看完了上面的property,剛付訓過神,現在又來了兩個更大的家伙是啥,其實這個兩個類裝飾器都是類里面的概念!
只要是寫代碼最后一定會走到類,而類的封裝和擴展是必須要掌握的,如何能有更好的封裝性呢,classmethod和staticmethod就派上用場了!
1).假如有一個場景,計算日期的類

2).更改需求,如果我們傳入的類初始化是字串型日期
我們目前的類的init函式是一個三個引數的,如果我們希望我們傳入一個字串性的日期"2018-10-8",然后回傳像上面的日期2018/10/8,怎么辦呢?
傳統的做法:

這樣的做法會導致每次初始化的時候,都要先分割成3個引數再匯入類,非常麻煩!
@staticmethod(類的靜態方法就派上場)

通過靜態函式,直接內置了分割的功能,會簡潔很多,而且封裝性也好很多!
3).但是靜態方法也有弊端
因為靜態方法是硬編碼,如果我們修改了Date這個類的名字,比如叫MyDate這樣的話,會導致我們寫的format_date里面的代碼也要改,因為我們直接是return Date()... ,好這個時候類方法classmethod上場了!

我們申明了一個類方法format_date2,里面有一個非常關鍵的變數cls,其實它就是類本身,這樣無論我們把類的名字改成什么,都沒有關系,因為我們回傳的就是cls(...),這樣代碼的柔性就強了很多!
有同學看到這里會問,那靜態函式還有什么用處,類方法都能代替了!在做一些類的預處理,或者條件判斷的時候,靜態函式還是很有用的!
05.super是啥
都說Python語言跟英語很類似,語法簡單,通俗易懂,但是看到super這樣關鍵字的時候,會有點懵懂!
其實只要是面向物件的語言,都有類的繼承啊,組合等等,Python當然也有這樣的設計,其實如果學過Java會非常好理解!比如子類要呼叫父類的方法,或者覆寫父類的方法都會用到super().
1).呼叫父類的方法

有的同學說我是不是可以直接呼叫A.say_hello(self),最好不要,涉及多重繼承的時候就會有問題
2).初始化父類的__init__方法

06.ABC模塊
新手有的時候看到下面的代碼會很懵,有點丈二和尚摸不著頭腦的趕腳:

C++里面有抽象基類的概念,Python里面的類在設計的時候,也考慮到了這一點,但是由于Python本身的特性是一切皆物件,大部分的時候都依賴鴨子型別,
為了完成抽象基類的功能,借助了第三方模塊abc(abc是抽象類的縮寫,不是英語abc的意思)
b=Bird()TypeError: Can't instantiate abstract class Bird with abstract methods fly
Bird繼承ABC,也就是說Bird是一個抽象類,不能被初始化,比如你初始化一下,會報錯的,
這個類的目的就是讓繼承它的子類一定要實體化fly函式,否則子類也永遠無法實體化

其實當你完全熟悉這些用法之后,你要開始思考Python為啥要這么設計,慢慢的你就會領悟Python這門語言的設計思想,而不是只是看它的招式,當你明白里招式背后的含義,恭喜你,你的功力又大漲了,另外不管你是為了Python就業還是興趣愛好,專案經驗永遠是核心,如果你缺新專案練習,可以去小編的Python交流.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,里面很多新教程專案,還可以跟老司機交流討教!
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/164444.html
標籤:Python
