pythonday17

来源:https://www.cnblogs.com/panda-pandeyong/archive/2018/07/25/9368562.html
-Advertisement-
Play Games

一, 繼承 繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為 基類或超類,新建的類稱為派生類或子類 1. python中類的繼承分為:單繼承和多繼承 2. 查看繼承 提示:如果沒有指定基類,python的類會預設繼承object類,object是所有pytho ...


一, 繼承

  繼承是一種創建新類的方式,在python中,新建的類可以繼承一個或多個父類,父類又可稱為

  基類或超類,新建的類稱為派生類或子類

 

  1. python中類的繼承分為:單繼承和多繼承

        class ParentClass1: #定義父類
            pass

        class ParentClass2: #定義父類
            pass

        class SubClass1(ParentClass1): #單繼承,基類是ParentClass1,派生類是SubClass
            pass

        class SubClass2(ParentClass1,ParentClass2): #python支持多繼承,用逗號分隔開多個繼承的類
            pass

 

  2. 查看繼承

        >>> SubClass1.__bases__ #__base__只查看從左到右繼承的第一個子類,__bases__則是查看所有繼承的父類
        (<class '__main__.ParentClass1'>,)
        >>> SubClass2.__bases__
        (<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

  提示:如果沒有指定基類,python的類會預設繼承object類,object是所有python類的基

  類,它提供了一些常見方法(如__str__)的實現。

 

        >>> ParentClass1.__bases__
        (<class 'object'>,)
        >>> ParentClass2.__bases__
        (<class 'object'>,)

 

  3. 繼承的重要性

========================第一部分
        例如
   
          貓可以:爬樹、吃

          狗可以:看門、吃

        如果我們要分別為貓和狗創建一個類,那麼就需要為 貓 和 狗 實現他們所有的功能,偽代碼如下:
 

        #貓和狗有大量相同的內容
        class 貓:

            def爬樹(self):
                print '爬樹'

            def 吃(self):
                # do something

        class 狗:

            def 看門(self):
                print '看門'

            def 吃(self):
                # do something


========================第二部分
        上述代碼不難看出,吃是貓和狗都具有的功能,而我們卻分別的貓和狗的類中編寫了兩次。如果使用 繼承 的思想,
        如下實現:

          動物:吃

             貓:爬樹(貓繼承動物的功能)

             狗:看門(狗繼承動物的功能)

        偽代碼如下:
        class 動物:

            def 吃(self):
                # do something
      
        # 在類後面括弧中寫入另外一個類名,表示當前類繼承另外一個類
        class 貓(動物):

            def爬樹(self):
                print '爬樹'

        # 在類後面括弧中寫入另外一個類名,表示當前類繼承另外一個類
        class 狗(動物):

             def 看門(self):
                print '看門'


========================第三部分
       #繼承的代碼實現
        class Animal:

            def eat(self):
                print("%s 吃 " %self.name)


        class Cat(Animal):

            def __init__(self, name):
                self.name = name
                self.breed = ''

            def爬樹(self):
                print '爬樹'

        class Dog(Animal):

            def __init__(self, name):
                self.name = name
                self.breed=''
  
            def 看門(self):
                print '看門'


# ######### 執行 #########

        c1 = Cat('小白家的小黑貓')
        c1.eat()


        d1 = Dog('胖子家的小瘦狗')
        d1.eat()

        使用繼承來重用代碼比較好的例子    

   

  4. 繼承的好處

   a,提高了代碼的復用性
   b:提高了代碼的維護性
   c:讓類與類之間產生了關係,是多態的前提

 

  5. 

        class Animal:
            zhuangtai='能運動'
            qiguan='有大腦'
            def __init__(self,name,sex,age):
                self.name=name
                self.sex=sex
                self.age=age
           def food(self):
                print('不好吃')

        class Person(Animal):
            def __init__(self, name, sex, age,shenggao):
                Animal.__init__(self, name, sex, age) #用類名調用方法,調用父類中的構造方法並執行.
                #super().__init__(name,sex,age)
                self.shenggao=shenggao

            def work(self,):
                print('每天上班')


        class Dog(Animal):
           def food(self):
                super().food()     #用super關鍵字使父類與子類中的food方法調用                                           #法都執行,super自動把self接收到的對象傳給
                                # 父類,不用在其()內寫self
                print('屎很香')


        p1=Person('','','20',165)
        d1=Dog('旺財','',10)
        print(p1.zhuangtai)     #用對象調用父類
        print(Person.zhuangtai)    #用類調用父類
        print(p1.__dict__)
        d1.food()                

 


二, 多繼承

  1、Python的類可以繼承多個類,Java和C#中則只能繼承一個類

  2、Python的類如果繼承了多個類,那麼其尋找方法的方式有兩種,分別是:

   深度優先廣度優先

 

 

  

  •    當類是經典類時,多繼承情況下,會按照深度優先方式查找
  •    當類是新式類時,多繼承情況下,會按照廣度優先方式查找

  3. 經典類和新式類,從字面上可以看出一個老一個新,新的必然包含了跟多的功能,也是之後

  推薦的寫法,從寫法上區分的話,如果 當前類或者父類繼承了object類,那麼該類便是新

  式類,否則便是經典類。

 

 

 

 

   4. 經典多繼承

        class D:

            def bar(self):
                print 'D.bar'
    

        class C(D):

            def bar(self):
                print 'C.bar'


        class B(D):

            def bar(self):
                print 'B.bar'


        class A(B, C):

            def bar(self):
                print 'A.bar'
    
        a = A()
        # 執行bar方法時
        # 首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中麽有,則繼續去D類中找,如果D類中麽有,則繼續去C類中找,如果還是未找到,則報錯
        # 所以,查找順序:A --> B --> D --> C
        # 在上述查找bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了
        a.bar()

 

   5. 新類多繼承

        class D(object):

            def bar(self):
                print 'D.bar'


        class C(D):

            def bar(self):
                print 'C.bar'


        class B(D):

            def bar(self):
                print 'B.bar'


        class A(B, C):

            def bar(self):
                print 'A.bar'

        a = A()
        # 執行bar方法時
        # 首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中麽有,則繼續去C類中找,如果C類中麽有,則繼續去D類中找,如果還是未找到,則報錯
        # 所以,查找順序:A --> B --> C --> D
        # 在上述查找bar方法的過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了
        a.bar()

 

  經典類:首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中麽有,則繼續

   去D類中找,如果D類中麽有,則繼續去C類中找,如果還是未找到,則報錯

  新式類:首先去A類中查找,如果A類中沒有,則繼續去B類中找,如果B類中麽有,則繼續

   去C類中找,如果C類中麽有,則繼續去D類中找,如果還是未找到,則報錯

  註意:在上述查找過程中,一旦找到,則尋找過程立即中斷,便不會再繼續找了

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 查看String的源碼可以發現它以一個char類型的數組保存字元串的,而String.length()方法返回的也是這個char數組的長度. 那麼,這個長度和"字元"長度有什麼關係呢? 在這裡就不得不引入碼點和代碼單元的概念,以下是摘抄至《Java核心技術捲一基礎知識(第十版)》中的定義: "碼點( ...
  • 實現HandlerInterceptor介面或者繼承HandlerInterceptor的子類,比如Spring 已經提供的實現了HandlerInterceptor 介面的抽象類HandlerInterceptorAdapter ,下麵講實現其介面的寫法,先看一下這個介面的三個方法. - 方法pr ...
  • Python中,主要的基本類型有:數字(int型)、字元串(string型)、列表(list型)、元祖(tuple型)、字典(direct型)、布爾值(boolean型) 1.int型 1.強轉int 2.查看類型 3.轉換進位 2.string型 1.常見的 2.可進行格式替換 3.判斷類型 4. ...
  • 定義視圖 本質就是一個函數 視圖的參數 一個HttpRequest實例 通過正則表達式組獲取的位置參數 通過正則表達式組獲得的關鍵字參數 在應用目錄下預設有views.py文件,一般視圖都定義在這個文件中 如果處理功能過多,可以將函數定義到不同的py文件中 一個HttpRequest實例 通過正則表 ...
  • 1、概念 裝飾器(decorator)就是:定義了一個函數,想在運行時動態增加功能,又不想改動函數本身的代碼。可以起到復用代碼的功能,避免每個函數重覆性編寫代碼,簡言之就是拓展原來函數功能的一種函數。在python中,裝飾器(decorator)分為函數裝飾器和類裝飾器兩種。python中內置的@語 ...
  • OpenFlow1.3.3 學習記錄(持續更新) 正在學習OpenFlow1.3,該篇筆記將日常更新,主要內容大致為官方文檔的總結與翻譯。 交換機組件 按照優先順序順序進行包匹配,如果匹配到流表項,則執行流表項中綁定的Instructions;如果沒有匹配到流表項,將根據table miss的配置進行 ...
  • 遇到一種業務場景,前端上傳的文件需要經過java服務轉發至文件服務。期間遇到了原生HttpClient怎麼使用的問題、怎麼把MultipartFile怎麼重新組裝成Http請求發送出去的問題、文件中文名亂碼問題。最後都解決了,先上代碼,再講遇到的坑 特別說明及遇到的坑: 1. 這裡基於tomcat進 ...
  • 大佬的總結(大贊!) final可以修飾:屬性,方法,類,局部變數(方法中的變數) final修飾的屬性的初始化可以在編譯期,也可以在運行期,初始化後不能被改變。 final修飾的屬性跟具體對象有關,在運行期初始化的final屬性,不同對象可以有不同的值。 final修飾的屬性表明是一個常數(創建後 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...