Python裏面這些點,聽說80%的新手都會一臉懵逼

Python雖然語法簡單,通俗易懂,可是再簡單它也是一門語言,就像一棵大樹,總有一些樹枝是彎彎繞繞的,讓新手看完以後一臉懵逼,今天咱們就來講說這幾個點,反正我學的時候是很困惑的!c++

01.函數裏面的 *args程序員

1).可變參數數組

這個是什麼鬼,尤爲是有其餘c,c++語言基礎的人,看到這個點,必定懵逼了,難道是指針,兩個**又是什麼鬼?函數

其實這個Python裏面的函數入參的幾種形式,假如你來設計一個語言,一個函數fun(),裏面要傳參數進來,要考慮擴展性:變量會有不少種形態,有多是變量,也多是數組,也多是結構體,或者是哈希數組。學習

好比你有一個累加功能的函數:編碼

Python裏面這些點,聽說80%的新手都會一臉懵逼

 

每次調用函數都要傳一個列表或者元組進去,很是死板,不靈活,若是我要傳多個列表,多個變量,我又不想改接口,可是改爲下面這樣就靈活不少:.net

Python裏面這些點,聽說80%的新手都會一臉懵逼

 

*args:表示可變參數,就是傳入的參數個數是可變的,能夠是1個、2個到任意個或者0個,其實就是把一堆參數看成一個數組(Python列表或者元組傳遞進來)。設計

02.關鍵字參數 **kwargs3d

關鍵字參數可讓你輸入0或者多個含參數名的參數,而且自動組裝爲一個字典指針

Python裏面這些點,聽說80%的新手都會一臉懵逼

 

你函數的接口設定爲**kwargs,這樣的好處,一個是靈活,擴展性好,也就是說我預留的了擴展的接口,你程序調用的時候能夠根據本身的需求傳1個,多個或者不傳均可以。

另外:不用太糾集args和kwargs這些英語單詞,只是你們約定這麼叫而已

03.臉萌的@property

有其餘經驗的程序員,看到這個奇奇怪怪的@加一個關鍵字,必定是一臉懵逼,這實際上是Python類裏面的一些封裝。這些都是類的內置裝飾器,有一些特殊的用途!

1).裝飾器@property

咱們大部分人都比較熟悉好比Java的get/set方法,好比:

Python裏面這些點,聽說80%的新手都會一臉懵逼

 

2).可是這樣寫比較麻煩,須要經過函數get/set 來訪問屬性

有木有直接對屬性進行操做的同時就能夠對屬性進行處理,好比咱們調用student.score=88,這一個時候會自動調用set_score函數,這樣就很是靈活和簡便!

Python裏面爲了簡潔和優雅,設計了@property

Python裏面這些點,聽說80%的新手都會一臉懵逼

 

對於外邊訪問的屬性score,咱們經過Python類中的property裝飾器對它進行升級,改造,讓它能變的更加靈活和強大!

其實它就是綁定了一些方法(fget,fset和fdel).尤爲是你對屬性進行升級功能而不改變外邊代碼的時候,這一招就很是有用!

 

04.傻傻分不清@classmethod和@staticmethod

看完了上面的property,剛剛回過神,如今又來了兩個更大的傢伙是啥,其實這個兩個類裝飾器都是類裏面的概念!

只要是寫代碼最後必定會走到類而類的封裝和擴展是必需要掌握的,如何能有更好的封裝性呢,classmethod和staticmethod就派上用場了!

1).假若有一個場景,計算日期的類

Python裏面這些點,聽說80%的新手都會一臉懵逼

 

2).更改需求,若是咱們傳入的類初始化是字符串型日期

咱們目前的類的init函數是一個三個參數的,若是咱們但願咱們傳入一個字符串性的日期"2018-10-8",而後返回像上面的日期2018/10/8,怎麼辦呢?

傳統的作法:

Python裏面這些點,聽說80%的新手都會一臉懵逼

 

這樣的作法會致使每次初始化的時候,都要先分割成3個參數再導入類,很是麻煩!

@staticmethod(類的靜態方法就派上場)

Python裏面這些點,聽說80%的新手都會一臉懵逼

更多資源與教程與你共享。

我作開發幾年的時間,若是你們對於學習Python的學習方法,學習路線以及:是自學仍是培訓的疑問,均可以加裙227-435-450隨時來問我。

經過靜態函數,直接內置了分割的功能,會簡潔不少,並且封裝性也好不少!

3).可是靜態方法也有弊端

由於靜態方法是硬編碼,若是咱們修改了Date這個類的名字,好比叫MyDate這樣的話,會致使咱們寫的format_date裏面的代碼也要改,由於咱們直接是return Date()... ,好這個時候類方法classmethod上場了

Python裏面這些點,聽說80%的新手都會一臉懵逼

 

咱們申明瞭一個類方法format_date2,裏面有一個很是關鍵的變量cls,其實它就是類自己,這樣不管咱們把類的名字改爲什麼,都沒有關係,由於咱們返回的就是cls(...),這樣代碼的柔性就強了不少!

有同窗看到這裏會問,那靜態函數還有什麼用處,類方法都能代替了!在作一些類的預處理,或者條件判斷的時候,靜態函數仍是頗有用的!

 

05.super是啥

都說Python語言跟英語很相似,語法簡單,通俗易懂,可是看到super這樣關鍵字的時候,會有點懵懂!

其實只要是面向對象的語言,都有類的繼承啊,組合等等。Python固然也有這樣的設計,其實若是學過Java會很是好理解!好比子類要調用父類的方法,或者覆蓋父類的方法都會用到super().

1).調用父類的方法

Python裏面這些點,聽說80%的新手都會一臉懵逼

 

有的同窗說我是否是能夠直接調用A.say_hello(self),最好不要,涉及多重繼承的時候就會有問題

2).初始化父類的__init__方法

Python裏面這些點,聽說80%的新手都會一臉懵逼

 

 

06.ABC模塊

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

Python裏面這些點,聽說80%的新手都會一臉懵逼

 

C++裏面有抽象基類的概念,Python裏面的類在設計的時候,也考慮到了這一點,可是因爲Python自己的特性是一切皆對象,大部分的時候都依賴鴨子類型。

爲了完成抽象基類的功能,藉助了第三方模塊abc(abc是抽象類的縮寫,不是英語abc的意思)

b=Bird()
TypeError: Can't instantiate abstract class Bird with abstract methods fly

Bird繼承ABC,也就是說Bird是一個抽象類,不能被初始化,好比你初始化一下,會報錯的。

這個類的目的就是讓繼承它的子類必定要實例化fly函數,不然子類也永遠沒法實例化

Python裏面這些點,聽說80%的新手都會一臉懵逼

 

其實當你徹底熟悉這些用法以後,你要開始思考Python爲啥要這麼設計,慢慢的你就會領悟Python這門語言的設計思想,而不是隻是看它的招式,當你明白裏招式背後的含義,恭喜你,你的功力又大漲了!

相關文章
相關標籤/搜索