Python雖然語法簡單,通俗易懂,但是再簡單它也是一門語言,就像一棵大樹,總有一些樹枝是彎彎繞繞的,讓新手看完之后一臉懵逼,今天我們就來說說這幾個點,反正我學的時候是很困惑的!
01.函數里面的 *args
1).可變參數
這個是什么鬼,尤其是有其他c,c++語言基礎的人,看到這個點,一定懵逼了,難道是指針,兩個**又是什么鬼?
其實這個Python里面的函數入參的幾種形式,假如你來設計一個語言,一個函數fun(),里面要傳參數進來,要考慮擴展性:變量會有很多種形態,有可能是變量,也可能是數組,也可能是結構體,或者是哈希數組。
比如你有一個累加功能的函數:
每次調用函數都要傳一個列表或者元組進去,非常死板,不靈活,如果我要傳多個列表,多個變量,我又不想改接口,但是改成下面這樣就靈活很多:
*args:表示可變參數,就是傳入的參數個數是可變的,可以是1個、2個到任意個或者0個,其實就是把一堆參數當作一個數組(Python列表或者元組傳遞進來)。
如果你依然在編程的世界里迷茫,可以加入我們的Python學習扣qun:784758214,看看前輩們是如何學習的。交流經驗。從基礎的python腳本到web開發、爬蟲、django、數據挖掘等,零基礎到項目實戰的資料都有整理。送給每一位python的小伙伴!分享一些學習的方法和需要注意的小細節,點擊加入我們的 python學習者聚集地
02.關鍵字參數 **kwargs
關鍵字參數可以讓你輸入0或者多個含參數名的參數,并且自動組裝為一個字典
你函數的接口設定為**kwargs,這樣的好處,一個是靈活,擴展性好,也就是說我預留的了擴展的接口,你程序調用的時候可以根據自己的需求傳1個,多個或者不傳都可以。
另外:不用太糾集args和kwargs這些英語單詞,只是大家約定這么叫而已
03.臉萌的@property
有其他經驗的程序員,看到這個奇奇怪怪的@加一個關鍵字,一定是一臉懵逼,這其實是Python類里面的一些封裝。這些都是類的內置裝飾器,有一些特殊的用途!
1).裝飾器@property
我們大部分人都比較熟悉比如Java的get/set方法,比如:
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這門語言的設計思想,而不是只是看它的招式,當你明白里招式背后的含義,恭喜你,你的功力又大漲了!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
