Python學習之路-隨筆02 python3的類和包

python的類和諸如JAVA,C++的類有不少類似性又有不少區別的地方,剛轉過來爲了更快的適應不一樣的用法和實現方式,統一記錄下來便於更快的熟悉和使用python

#和其餘語言的類的區別點

  #空類必須有pass方法,類的實例化時若是沒有改變類內參數和方法,那它們的地址和原類內的元素地址一致,實例化的類對應沒賦值的屬性不會放進對象當中,沒有成員。即不分配新內存。

class Student():
    name = "ming"
    age = 18
stu1 = Student()
print(id(Student.name))
print(id(stu1.name))

  2129549328712
  2129549328712程序員

  #關於函數,通常有三種,類的綁定函數,對象綁定函數,靜態函數(也就是類方法,實例方法,靜態方法)。原由是IDE寫類的方法的時候自動加上self參數

    #類的綁定函數:沒有self參數,經過類名點出來使用,能夠被繼承,須要加一個描述符@classmethod

    #對象綁定函數(就是最多見的實例方法):IDE寫的時候默認有一個self參數,經過類實例化後的對象點出來調用使用,方法的第一個參數是默認傳進去的實例對象自己。類也能夠調用, 可是須要手動傳入類。

    #靜態函數:不須要實例就能夠調用,也沒有self參數,須要在以前聲明加一個描述符@staticmethod,不能被繼承。

  #關於python3的封裝

    #總的來講是一個障眼法,利用了name mangling的更名策略,本質就是至關於多了個相似於「筆名」的東西(加上類名前綴,經過__dict__可看到),經過筆名調用而已,掩蓋原來的名字,方法是加下劃線。

    protected:_XXX(一個下劃線),子類可訪問,不能被from * import導入函數

    private:__XXX(兩個下劃線),子類和類外都不能訪問spa

    其餘:XXX_,防止關鍵字命名衝突,__XXX__:魔術方法,後面說。code

  #python的多繼承

    #python多態的實現方式

    #沒有硬性語法規定,因此只靠約定來實現約束和解決一些多繼承的問題

    #解決方法:用Mixin來給類添加新功能,相似於interface接口。要求實現的Mixin功能單一,實現方式是多繼承。該方式解決的問題是MRO查找順序和鑽石調用等問題,

     和接口不一樣的是Mixin能夠有默認實現,不須要在宿主類裏強制實現。MRO至關於血緣列表,按照規定的順序排列好存在元組中,能夠經過類名.__mro__查看。

  #魔術方法

    #不須要認爲調用的方法,在特定時刻會自動觸發,例如__init__,__new__等。

    #通常分爲四類

      操做類魔術方法,例如__str__,__repr__,__call__等。

      描述符相關,__set__,__get__,__delete__等。

      屬性操做相關,__getattr__,setattr__等。

      運算分類相關,__gt__大於判斷時觸發,相似的還有加減等。

    #探究一下__str__和__repr__,由於會常常碰到。

      __str__:把對象當作字符串使用的時候調用,須要返回一個字符串。若是沒有實現該方法而實現了__repr__則用__repr__代替__str__方法。

      __repr__:也是返回字符串,和str相似,區別在於面向的人羣不同。str面向用戶,而repr則是面向程序員,爲何這麼說呢,根據官方文檔解釋,__repr__更傾向於返回一個能夠做爲

      eval()函數參數使用的字符串,而eval函數能夠經過字符串逆向生成一個對象。好比 a == eval(repr(a)).

  #抽象類

    #須要藉助元類ABCMeta才能實現,實現方式是import abc。在類的參數須要聲明繼承的元類,例如class A(object, metaclass = abc.ABCMeta)

    #抽象類的修飾符,@abc.abstractmethod,@abc.abstractclassmethod,@abc.abstractstaticmethod.須要注意子類須要所有實現抽象類的方法才能實例化使用,有一個沒實現完都不行。

    #自定義類,首先是利用type函數來組裝,type(組裝後的新類名,父類,類內的成員和變量(以dict的鍵值對形式))

def walk(self):
    print("Walking in the sky")
    
def talk(self):
    print("Talking")
 
A = type("superman", (object, ), {"class_walk":walk, "talk":talk})
a = A()
a.class_walk()
a.talk()

 

Walking in the sky
Talking

    第二種方法是經過from types import MethodType,該方法能夠把一個函數裝進類裏。使用方式是MethodType(函數, 類名)

#包

  #包須要注意的地方不是不少,就索性一塊兒寫進去吧。

  #包就是包含__init__.py文件和其餘一堆XX.py文件的文件夾。關鍵是那個__init__.py文件。

  #導入方法:import 模塊名,import 模塊 as XXX,from 模塊名 import 類名/函數名/*,導入數字開頭通常py不容許數字開頭的命名方法,但外部文件系統能夠。導入這類須要用到importlib。導入importlib後,test = importlib.import_module("XX")

           import 包名,只會導入包內的__init__.py文件,爲了不這個能夠from 包名 import 模塊1,模塊2.....。而from 包名 import *也仍是導入__init__.py的所有。

        還有就是能夠在導入__init__.py的時候在裏面實現__all__來控制導入的內容,__all__以後的代碼則不執行導入。使用方法__all__ = ['module1', 'module2', 'package1'.....]

done

相關文章
相關標籤/搜索