<button id="2ddn7"><acronym id="2ddn7"></acronym></button>

<button id="2ddn7"><acronym id="2ddn7"></acronym></button>

  • <button id="2ddn7"><object id="2ddn7"></object></button>
      1. <s id="2ddn7"></s>
        更多課程 選擇中心


        Python培訓

        400-111-8989

        Python面向對象編程學習筆記

        • 發布:Python培訓
        • 來源:Python教程知識
        • 時間:2017-07-10 18:00

        1.為什么需要面向對象編程

        我們先來看看函數式編程和面向對象編程的一點區別:

        假設我們要打印兩位公司同事的文檔,如果是函數式編程,我們會這樣寫:

        staff1 = {'name':'a','document':'a_document'} staff2 = {'name':'b','document':'b_ducument'}defprint_document(staff):   print('%s: %s'% (staff['name'],staff['document']))

        這樣寫有什么不好的地方呢?每當我們新增一個學生,我們都需要在新增一個staffx。于是,聰明的人就在想,我們能不能把staff抽象成為一種數據類型,然后這個數據類型里面有各種各樣的方法,于是就有了面向對象的編程思維:

        classStaff(object):   def__init__(self, name, document):       self.name = name        self.document = document    defprint_document(self):       print('%s: %s'% (self.name, self.document))

        除了print_document方法以外,我們還可以為這個類新增其他的方法。 這樣,類就變成了更好的抽象,他即是一種數據類型,數據類型中又包含對這個數據類型的方法。

        2. 實例

        類是對事物的抽象,但抽象并不能做具體的事情,比如上面的例子,當我們要去打印某個職員的文檔時,我們必須要針對這個類,新建實例。 類是抽象,實例是對抽象的具體。

        比如,我們要調用上述的Staff類,我們可以:

        staff1 =Staff('a','a_document')staff1.print_document()

        其實這樣還有一個好處,就是我們無需關心class內部是如何實現print_document()的,所謂的黑箱原理。

        3. 構造器

        我們通過調用特殊方法__init__初始化,當創建了這個類的實例時,就會調用該方法。 該方法與self參數息息相關,構造函數必須有一個self參數,self代表類的實例。 我的理解是:因為類中沒有實例,self提供了一種方法,可以在后面的方法中對自己進行操作的引用。

        4. 繼承和多態

        繼承很好理解,我們將類示為一個二叉樹,子節點都繼承了父節點的方法。 比如,對于另外一個部門的員工,希望繼承之前的Staff類,那我們可以這樣寫:

        classDepartment2Staff(Staff):   pass

        Department2Staff這個類,就自動繼承了Staff的方法,不信,你可以試一試:

        department2staff =Department2Staff('m','m_document')department2staff.print_document()

        那我們能不能在Department2Staff中重新實現print_document()方法呢?答案是肯定的,這叫做重載。 實現方法的重載之后,我們又獲得了繼承的另外一個好處,多態。 department2staff即屬于另外一個部門的員工(是Department2Staff類型),也屬于一個員工(是Satff類型)。

        要理解多態的好處,我們再寫一個函數:

        defprint_twice(Staff):   Staff.print_document()    Staff.print_document()

        于是:當我們輸入的是staff1實例時候( print_twice(Staff1)),會把a打印兩次,當我們輸入的是department2staff實例的時候(print_twice(department2staff)),會把m打印兩次。

        也就是新增一個Staff的子類,不必對print_twice()函數做任何的修改,這就是多態的好處。

        5.在外部獲取和操作對象

        通過getattr(),setattr(),hasattr(),可以直接操作一個對象的狀態。正如他們的名字那么直接,get是獲取一個屬性,setattr是設置一個屬性,has是判斷是否有這個屬性.

        hasattr(department2staff,'print_document')#結果是true

        廖雪峰老師的教程中,一個例子給我留下了深刻的印象:

        defreadImage(fp):   ifhasattr(fp,'read'):            returnreadData(fp)        returnNone

        6. 關于實例屬性和類屬性

        我們可以為一個實例動態綁定一個屬性,比如:

        department2staff.eating='only workday'

        這個屬性只在department2staff中有,不信可以再新增一個實例,然后調用eating屬性,是不會返回結果的。 如果要讓這個屬性在每一個實例中出現,則在class中實現就好了。

        classDepartment2Staff(Staff):   def__init__(self, eating):       self.eating = eating

        特別注意:實例屬性優先級比類屬性高。

        7. 給實例綁定或限制綁定屬性與方法

        在類的外部,我們可以給類綁定屬性和方法。

        ##給實例綁定一個屬性staff3 = Staff('c','c_document') staff3.eating ='everyday'##給實例綁定一個方法defeating(self, eating):   self.eating = eating    fromtypesimportMethodType staff3.eating = MethodType(eating, staff3)##給類綁定一個方法Staff.eating = eating

        加入我們要限制實例的屬性怎么辦?比如,我們只允許對Staff添加eating屬性,那就要用到一個特殊的__slots__變量。

        classStaff(obejct):   __slots__ = ('eating')

        注意:__slots__只對當前類起作用,對繼承的子類是不起作用的。

        8.多重繼承

        首先,要了解,為什么需要多重繼承。在現實生活中,一個物品可能不只屬于一個類。 比如,我們一個企業的員工,他除了屬于一個部門之外,他還屬于某個俱樂部,比如工會、籃球、德撲等等。 如果是只能繼承一個類,那我們就要設計成:-員工--部門1---俱樂部1---俱樂部2--部門2---俱樂部1---俱樂部2,以此類推。如果我們在要增加“宗教信仰類”,那效率就太低了,類的數量會呈現指數及增長。 Python的多重繼承特性能夠給我們提供很好的解決方案,我們可以這樣來設計。 首先,依然按照部門來分類:

        classStaff(object):    pass # 大類    classDepartment1(Staff):    pass    classDepartment2(Staff):    pass    classClub1(Staff):    pass    classClub2(Staff):    pass     # 我們要讓一個staff同時有Department和Club的屬性,我們只需要:classstaff_club(Department1,Club1)# 甚至,我們可以再為他們加上一個是周幾在公司吃飯的功能:classEating(object):    def eating(self,eating):        self.eating = eating        classstaff_club_eating(Department1,Club1,eating)    pass

        這在python中叫做MinIn,MixIn的目的就是給一個類增加多個功能,這樣,在設計類的時候,我們優先考慮通過多重繼承來組合多個MixIn的功能,而不是設計多層次的復雜的繼承關系。

        預約申請免費試聽課

        填寫下面表單即可預約申請免費試聽!怕錢不夠?可就業掙錢后再付學費! 怕學不會?助教全程陪讀,隨時解惑!擔心就業?一地學習,可全國推薦就業!

        上一篇:Python3內建函數簡介,Python3內建函數詳解
        下一篇:python中Exec和Eval的區別

        Python中類的屬性有哪幾種

        Python語法你知道多少

        Python 中常見的配置文件寫法

        Python爬蟲可以做什么

        • 掃碼領取資料

          回復關鍵字:視頻資料

          免費領取 達內課程視頻學習資料

        • 視頻學習QQ群

          添加QQ群:1143617948

          免費領取達內課程視頻學習資料

        Copyright ? 2021 Tedu.cn All Rights Reserved 京ICP備08000853號-56 京公網安備 11010802029508號 達內時代科技集團有限公司 版權所有

        選擇城市和中心
        黑龍江省

        吉林省

        河北省

        湖南省

        貴州省

        云南省

        廣西省

        海南省

        青青青草网站免费观看|青青青视频在线观看 超真实强奷视频在线看 百度 好搜 搜狗
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>