1. 程式人生 > >python基礎之小知識點(1)

python基礎之小知識點(1)

 學習過程隨意記錄的小知識點

一、基礎篇

1.在Python中,在函式內部針對引數 賦值 不會影響外部引數
2.在Python中,在函式內部使用 方法 修改可變引數會影響外部引數
3.在列表中使用 = (等號),本質上是呼叫 extend 方法


預設引數:
1.指定函式的預設引數---》 在引數後使用 賦值 語句,可以指定引數的預設值
    必須保證 帶有預設值得預設引數 在引數列表末尾

2.帶有多個預設引數的函式:
    在呼叫函式時,如果有多個預設引數,需要指定引數名,這樣直譯器才能夠知道引數的對應關係(參考sort方法)

3.多值引數:
    3.1 函式要處理的引數不確定是 ,使用多值引數
    3.2 兩種:
        3.2.1 引數名前增加一個  *  可以接收 元組
        3.2.2 引數名前增加兩個  *  可以接收 字典
    3.3 預設多值引數名:
        元組: *args
        列表: *kwargs

4.元組和字典的拆包:
    在呼叫帶有多值引數的函式時,如果希望:
        將元組變數,直接傳遞給 args
        將字典變數,直接傳遞給 kwargs
    就可以使用拆包,簡化引數的傳遞,方法:
        在元組變數前,增加;一個 *
        在字典變數前,增加;兩個 *


二、面向物件篇

1.類是模板,物件是根據 類 這個模板創建出來的,應該先有類,再有物件
2.類中定義了什麼屬性和方法,物件中就有什麼屬性和方法,不可能多,也不可以少

3.利用好 dir() 這個函式,可以檢視 型別或資料含有的 方法

4.在類中定義函式時,第一個引數必須是 self
    在類封裝的方法 內部,self就表示當前呼叫方法的物件自己
    哪一個物件呼叫的方法,self就是哪一個物件的引用,及self是引用這個物件的記憶體地址,self引用的地址和這個物件的地址是一樣的
    使用self:只需在self後面加上 .屬性名(行為名) 即可

5.給物件增加屬性:
    不推薦,因為:物件屬性的封裝應該封裝在類的內部
    只需要在 類的外部的程式碼 中直接通過 .屬性名 設定一個屬性即可
    使用這種方法新增的屬性,並不能給 類 新增屬性,只能給當前這個物件新增屬性

6.在初始化方法內部定義屬性:----簡化物件的建立
    作用:1.為物件在記憶體中分配空間---建立物件     2.為 物件 的屬性 設定初始值---初始化方法(__init__ )
    在__init__ 方法內部使用 self.屬性名 = 屬性的初始值  就可以定義屬性
    定義屬性之後,在使用 xx類 建立的物件,都會擁有該屬性

  對初始化方法的改造:初始化的同事設定初始值:
     __init__ 方法中定義要增加形參(引數)
     在__init__ 方法內部使用 self.屬性 = 形參  接收外部傳遞的引數
     在建立物件時,使用 類名(屬性1,屬性2...) 呼叫

7. __del__   和  __str__  方法

8.私有方法:只能在物件的內部被使用,而不在外邊被訪問到
    私有屬性和方法,都不允許在外界直接訪問
       連 print(物件.屬性或方法) 都不行,報錯

9.沒有整整真正意義的私有:
    不推薦,因為既然是私有的了,那就要保證私有的隱私性
    方式:在 名稱 前面加上 _類名 ==》 _類名__名稱


三、繼承篇

面向物件三大特性:
    1.【封裝】 根據職責將 屬性 和 方法 封裝到一個抽象的類中
    2.【繼承】 實現程式碼的重用,相同的程式碼不再需要重寫
    3.【多型】 不同的物件呼叫相同的方法,產生不同的執行結果,增加程式碼的靈活度

(1)、單繼承

1.繼承的概念、語法和特點
   1.1 概念:子類擁有父類的所有方法和屬性
    
   1.2 語法:
        class 類名(父類名):
            pass
    
       · 子類 繼承自父類,可以直接享受父類中已經封裝好的方法,不需要再次開發
       · 子類中應該根據職責,封裝子類特有的屬性和方法

    1.3 專業術語
        · xx類是xx類的子類, xx類是xx類的父類, xx類從xx類繼承
        · xx類是xx類的派生類, xx類是xx類的基類, xx類從xx類派生

    
    1.4 繼承的傳遞性:
        · C類從B類繼承,B類又從A類繼承
        · 那麼C 了就具有B類和A類的所有屬性和方法
        
         " 子類擁有父類以及父類的父類的所有屬性和方法 "


2.方法的重寫    (父類的方法不能滿足子類的需求,這就要對方法進行重寫了)
    
    重寫父類方法的兩種情況:
        1.覆蓋父類的方法
        2.對父類方法進行擴充套件

    1.1 覆蓋父類的方法:
        ·父類的方法實現和子類的方法實現完全不同,就可用覆蓋方法,在子類中重新編寫父類的方法實現(就相當於在子類中定義了 一個和父類同名的方法並且實現)
        ·覆蓋之後,執行程式時,只會呼叫子類中重寫的方法,不會再呼叫父類中封裝的方法了
                  

    2.1 擴充套件:
        ·(場景)子類的方法實現中包含父類對的方法實現(父類原本封裝的方法實現是子類方法的一部分)
        ·方法:
            在子類中重寫父類的方法
            在需要的位置使用 super().父類方法 來呼叫父類方法的執行
            程式碼其他的位置針對之類的需要,編寫子類特有的程式碼實現

        ·程式碼實現::
        class Dog:
            def fly(self):
                print("我會飛:)

        class Xiaohei(Gog):
             def fly(self):
                print("我飛的很快:)
                super().fly()


3.父類的私有屬性是方法:

    ·子類物件不能在自己的方法內部,直接訪問父類的私有屬性和方法

    ·子類物件可以通過父類的 公共方法 間接訪問到私有屬性和私有方法

        私有屬性、方法是物件的隱私,不對外公開,外界及子類不能直接訪問

        私有屬性、方法通常用於做一下內部的事情


(2)、多繼承

1.概念:

    ·子類可以擁有多個父類,並且具有所有父類的屬性和方法
        例如:孩子會繼承自己父親和母親的特徵

2.語法:

    class 子類名(父類名1, 父類名2.。。):

        pass 

3.如果父類之間存在相同名字的屬性或者方法,就應該避免使用多繼承

4.內建方法:

    __mro__
        
        MRO 是 method resolution order, 主要有於 在 多繼承時判斷 方法、屬性的呼叫路徑(順序)

    使用:
    
        print(類名.__mro__)



四、多型篇

    ----不同的 子類物件 呼叫相同的父類方法,產生不同的執行結果

    ·多型可以增加程式碼的靈活度
    ·以繼承和重寫父類方法為前提
    ·是呼叫方法的技巧,不會影響到類的內部設計 




五、類物件        ---類是一個特殊的物件

    在python中,一切都是物件
    
        · class AAA:    定義的類屬於 類物件
        · obj1 = AAA()   屬於例項物件

    在程式執行時,類同樣會被載入到記憶體

    在python中,類是一個特殊的物件 --- 類物件

    在程式執行時,類物件在記憶體中只有一份,使用一個類可以建立很多個物件例項

    除了封裝例項的屬性和方法外,類物件還可以擁有自己的屬性和方法
        ·類屬性
        ·類方法

    通過 類名. 的方式可以訪問類的屬性 或者 呼叫類的方法


(1)、類屬性

1.概念和使用

    ·類屬性 就是給 類物件 中定義的屬性
    ·通常用來記錄與這個類相關的特徵
    · 類屬性 不會用於記錄 具體物件的特徵
        
    使用 = 賦值語句在 class 關鍵字下方可以定義 類屬性

    類名.類屬性 --- 訪問方法


(2)、類方法

    · 類方法 就是針對 類物件 定義的方法

        在類方法內部可以直接訪問類屬性或者呼叫其他的類方法

    ·語法:
        
        @classmethod
        def 類方法名(cls):
            pass

            
            `類方法需要用 修飾器 @classmethod 來表識,告訴直譯器這是一個類方法

            ·類方法的第一個引數應該是 cls

                由哪一個類呼叫的方法,方法內部的 cls 就是那一個類的引用

                這個引數和例項方法的第一個引數self類似

                提示使用其他名稱也可以,不過習慣使用 cls


            ·通過 類名. 呼叫類方法,呼叫方法時,不需要傳遞 cls 引數

            ·在方法內部:   
                 
                可以通過 cls. 訪問類的 屬性

                也可以通過 cls. 呼叫其他的類方法   



六、靜態方法
    
    如果需要在類中封裝一個方法,且這個方法:
        既不需要訪問例項屬性或者例項方法
        也不需要訪問類屬性或者類方法

    這個時候,就可以把這個方法封裝成一個靜態方法

    語法:
        
        @staticmethod
        def 靜態方法名():                    # 不需要引數
            print("小鳥要飛")

            
            靜態方法需要使用 @staticmethod 修飾器來表識,告訴直譯器這是一個靜態方法

            通過 類名.  呼叫靜態方法




七、
__new__    方法