面向對象:介面思想、多態、鴨子類型、反射、內置方法、異常處理

来源:https://www.cnblogs.com/oldboy2019/archive/2019/04/22/10753695.html
-Advertisement-
Play Games

一、介面思想 建立關聯的橋梁,方便管理代碼 介面思想提現:為類拓展功能 介面類:用來定義功能的類,為繼承它的子類提供功能的。 該類的功能方法一般不需要有實現體,實現體有繼承它的子類自己去實現。 介面類:用來定義功能的類,為繼承它的子類提供功能的。 該類的功能方法一般不需要有實現體,實現體有繼承它的子 ...


一、介面思想

  • 建立關聯的橋梁,方便管理代碼
  • 介面思想提現:為類拓展功能
  • 介面類:用來定義功能的類,為繼承它的子類提供功能的。 該類的功能方法一般不需要有實現體,實現體有繼承它的子類自己去實現。
#提供所有看門應該有的功能
class WatchInterface:
    def watch_door(self):
        pass

#沒有去繼承PetInterface,WatchInterface的Dog就是普通的Dog類
#但繼承了PetInterface,該Dog就可以作為寵物狗,同理繼承WatchInterface就可以作為看門狗
class Dog(PetIterface,WatchInterface):
    def jiao(self):
        pass
    
    def chi(self):
        pass
    
    def pao(self):
        pass
    
    #可以作為寵物及看門貓
    class Cat(PetIterface,WatchInterface):
        pass

 

二、多態(重點)

定義:多態指的是一類事物有多種形態。

  動物有多種形態:人,狗,豬

  文件有多種形態:文本文件,可執行文件

  相當於我們在父類中定義一個統一的多個共同形態的方法,比如人狗豬都能吃跑叫這些方法,我們在父類將其方法進行抽象,即抽象方法,這種方法的實現體是抽象的,也就是說只寫方法函數名,具體代碼塊實現不寫,交由子類重寫具體實現體。

  具體實現方法:  

  • import abc            #abstract base class
  • class Sup(metaclass=abc.ABCMeta):            #Sup為父類
  • 將抽離對象加裝飾器@abc.abstractmethod
    • 子類對應方法必須重寫,必須有自己的實現體,不然報錯
    • 抽象父類中的抽象方法實現體無意義,實現不實現一樣。
    • 註意點:有抽象方法的父類不能被實例化

簡言之:我在父類定一些可以抽離的公共方法的模板,你們下麵的子類必須按照子類的這個模板方法去執行,至於具體執行實現體代碼輸出信息你們子類自己根據自己的情況去輸出想要的信息。但是模板必須有樣,做不到我就給你報錯。

看下麵的例子:

import abc
class Quan(metaclass=abc.ABCMeta):
    def __init__(self,name):
        self.name=name
    #共有方法,模板來了,小的們,照這個模板去開頭,具體實現體你們去重寫吧,我不管
    @abc.abstractmethod
    def chi(self):
        pass

    @abc.abstractmethod
    def jiao(self):
        pass

class Dog(Quan):
    def kanmen(self):
        print(self.name+'看門')

    def chi(self):
        # super().chi()
        print(self.name+'吃狗糧')

    def jiao(self):
        print('汪汪汪')


class Wolf(Quan):
    def bulie(self):
        print(self.name + '捕獵')

    def chi(self):
        super().chi()
        print(self.name + '吃肉')

    def jiao(self):
        print('嗷嗷嗷')

dog=Dog('來福')
wolf=Wolf('常威')

dog.jiao()
wolf.jiao()
dog.chi()
wolf.chi()

在面向對象方法中一般是這樣表述多態性:

    向不同的對象發送同一條消息(!!!obj.func():是調用了obj的方法func,又稱為向obj發送了一條消息func),不同的對象在接收時會產生不同的行為(即方法)。也就是說,每個對象可以用自己的方式去響應共同的消息。所謂消息,就是調用函數,不同的行為就是指不同的實現,即執行不同的函數。

    比如:老師.下課鈴響了(),學生.下課鈴響了(),老師執行的是下班操作,學生執行的是放學操作,雖然二者消息一樣,但是執行的效果不同

總結:多態性的好處:

  • 增加了程式的靈活性:以不變應萬變,不論對象千變萬化,使用者都是同一種形式去調用
  • 增加了程式的可擴展性

三、鴨子類型

如果看起來像、叫聲像而且走起路來像鴨子,那麼它就是鴨子

#二者都像鴨子,二者看起來都像文件,因而就可以當文件一樣去用
class TxtFile:
    def read(self):
        pass

    def write(self):
        pass

class DiskFile:
    def read(self):
        pass
    def write(self):
        pass

四、反射

反射:通過字元串來反射/映射到對象/類的屬性上

 

class People:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def run(self):
        print('%s is running'%self.name)

obj=People('egon',18)

# ------------------------------------------------------------
# hasattr:查看對象中是否有某個屬性(屬性應該為字元串格式的屬性名),有返回True,沒有返回False
print(hasattr(obj,'name'))
#結果為:True
#判斷對象名obj中是否有'name'這個預設屬性,相當於'name' in obj.__dict__

# ------------------------------------------------------------
# getattr:取出對象中某個屬性的值(屬性應該為字元串格式的屬性名),如果沒有該屬性,報錯,可以設置無該屬性時候的返回值
print(getattr(obj,'name'))
#結果為:egon
#取出對象名obj中屬性'name'的值,相當於obj.__dict__['name']
print(getattr(obj,'xxx','沒有該對象'))
#結果為:沒有該對象
#取出對象名obj中屬性'xxx'的值,如果沒有則返回'沒有該對象'

# ------------------------------------------------------------
# setattr:將對象中的某個屬性賦予新值(屬性應該為字元串格式的屬性名),如果該屬性無,添加屬性以及值
setattr(obj,'name','EGON')
#將原對象中的'name'賦予新值'EGON',相當於obj.__dict__['name']='EGON'
setattr(obj,'xxx',1111)
#xxx不在原對象名稱空間,則新增屬性xxx並賦予值1111,相當於obj.__dict__['xxx']=1111
print(obj.name)
#結果為:EGON
print(obj.__dict__)
#結果為:{'name':'EGON','age':18,'xxx':1111}

# ------------------------------------------------------------
# delattr:刪除對象中的某個屬性(屬性應該為字元串格式的屬性名)
delattr(obj,'name')   #刪除對象中的某個屬性
print(obj.__dict__)
#結果為 :{'age':18}

# 註意:以上操作過程,都涉及到對象屬性,傳入參數的屬性應該都為字元串格式,最後將字元串格式的處理結果反射到對象屬性的值上。
# 可以用下麵使用實例來加深反射的意義:

import os
os.remove
print(hasattr(os,'remove'))  #結果為True

class Ftp:
    def get(self):
        print('運行get函數')
    def put(self):
        print('運行put函數')
    def login(self):
        print('運行login函數')

    def run(self):
        while True:
            cmd=input('>>>>>:').strip()
            if hasattr(self,cmd):
                method=getattr(self,cmd)
                method()
            else:
                print('輸入的方法不存在')

# obj=Ftp()
# obj.run()
'''
# 結果:
# >>>>>:get
# 運行get函數
# >>>>>:put
# 運行put函數
# >>>>>:login
# 運行login函數
# >>>>>:hah
# 輸入的方法不存在
# .....

'''

 

五、內置方法
'''
1__str__: 在對象被列印時自動觸發,可以用來定義對象被列印時的輸出信息
#  註意:必須返回一個字元串類型的值
class People:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def __str__(self):
        return 'name:%s age:%s'%(self.name,self.age)

obj1=People('egon',18)
print(obj1)  #實際上在執行:print(obj1.__str__())
#結果為:name:egon age:18

obj2=list([1,2,3])
print(obj2)
結果為:[1, 2, 3]
'''
# 2__del__: 在對象被刪除時先自動觸發該方法,可以用來回收對象以外其他相關資源,比如系統資源
class Foo:

    def __init__(self,x,filepath,encoding='utf-8'):
        self.x=x
        self.f=open(filepath,'rt',encoding=encoding)

    def __del__(self):
        print('runing....')
        #回收對象關聯的其他資源
        self.f.close()

obj=Foo(1,'a.txt')
# del obj
print('=========>')

# 3__call__: 在對象被調用時會自動觸發該方法,可以用來???
class Foo:
    def __init__(self,x,y):
        self.x=x
        self.y=y

    def __call__(self, *args, **kwargs):
        print(self,args,kwargs)

obj=Foo(1,2)
obj(1,2,a=3,b=4)  #相當於obj.__call__(obj,1,2,a=3,b=4)
# 結果為:<__main__.Foo object at 0x000001B6ABA35B00> (1, 2) {'a': 3, 'b': 4}
六、異常處理
  • 程式運行時的錯誤
  • 程式中的異常處理機制:
    1. 程式中的所有異常都會被處理
    2. 程式中的所有異常都需要手動處理
    3. 如果沒有手動處理異常,異常會交給Python解釋器處理
      • 處理方式就是列印異常信息,並停止接收器
  • 異常的信息的三部分:
    1. 異常的追蹤信息:提示錯誤位置
    2. 異常的類型:告知處理異常應該捕獲什麼類型
    3. 異常的內容:告知錯誤信息
處理異常的語法:
try:
    #會出現異常的代碼塊

except '異常類型' as '異常別名':
    #異常處理邏輯

else:
    #沒有出現異常會執行該分支

finally:
    #無論是否出現異常都會執行該分支

實例:
try:
    print(adadadadada)

except NameError as e:
    print('異常信息:',e)

else:
    print('被檢測的代碼塊正常')

finally:
    print('異常是否出現都會執行該分支')

print('結束')
#結果:
異常信息: name 'adadadadada' is not defined
異常是否出現都會執行該分支
結束

 


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

-Advertisement-
Play Games
更多相關文章
  • @ "TOC" 1.變數 變數用於存儲要在電腦程式中引用和操作的信息。它們的唯一目的是在記憶體中標記和存儲數據。然後可以在整個程式中使用這些數據。變數存儲在記憶體中的值。這就意味著在創建變數時會在記憶體中開闢一個空間。 基於變數的數據類型,解釋器會分配指定記憶體,並決定什麼數據可以被存儲在記憶體中。因此,變 ...
  • NumPy: 1、NumPy 是一個功能強大的第三方庫(需要自己安裝),主要用於對多維數組執行計算; 它提供了大量的庫函數和操作,可以幫助程式員更輕鬆地進行數值計算 2、可以和另外兩個第三方庫 SciPy 和 Matplotlib 一起使用從而在一定程度上替換對 Matlab 的使用 3、主要應用: ...
  • R語言基礎學習——D02 20190423內容綱要: 1、前言 2、向量操作 (1)常規操作 (2)不定長向量計算 (3)序列 (4)向量的刪除與保留 3、列表詳解 (1)列表的索引 (2)列表得元素屬性 (3)更改列表元素 (4)刪除列表元素 (5)合併兩個列表 (6)將列表轉換為向量 4、推薦 ...
  • 一、引言 大部分系統都離不開數據訪問,資料庫包括SQL和NOSQL,SQL是指關係型資料庫,常見的有SQL Server,Oracle,MySQL(開源),NOSQL是泛指非關係型資料庫,常見的有MongoDB,Redis。 用spring開發時我們常用的ORM框架有JDBC、Mybatis,Hib ...
  • java.util.logging.Logger——java 中提供的日誌類 實際開發 90% 都是使用 log4j 記錄日誌,而 Log4j 底層就是 java.util.logging.Logger 實現的 Log4j 是一個日誌輸出框架,就是用於輸出日誌的。Mybatis 的日誌輸出是通過 L ...
  • 1.cd 到指定目錄 2.運行命令 python 3之前 python 3+ 3.運行後: 4.在瀏覽器輸入 http://localhost:8888/. 測試,然後就可以瀏覽網頁 ...
  • 閱讀目錄 一、模塊和包 模塊(module)的概念: 在電腦程式的開發過程中,隨著程式代碼越寫越多,在一個文件里代碼會越來越長,越來越不容易維護。 為了編寫可維護的代碼,我們把很多函數分組,分別放到不同的文件里,這樣,每個文件包含的代碼就相對較少,很多編程語言都採用這種組織代碼的方式。在Pytho ...
  • 新聞 "Ionide試驗版本" "FSharp路線圖介紹" "Blazor官方預覽" ".NET Framework 4.8發佈" ".NET Core 3 Preview 4發佈" "需要來自FSharp.Data.SqlClient用戶的反饋" "Fable.React 5發佈" "Though ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...