15面向對象特性

来源:https://www.cnblogs.com/daguo118/archive/2023/04/23/17347492.html
-Advertisement-
Play Games

面向對象特性 封裝 在程式設計中,封裝(Encapsulation)是對具體對象的一種抽象,即將某些部分隱藏起來,在程式外部看不到,其含義是其他程式無法調用。要瞭解封裝,離不開“私有化”,就是將類或者是函數中的某些屬性限制在某個區域之內,外部無法調用。 封裝的作用: 1、保護隱私(把不想別人知道的東 ...


面向對象特性

封裝

  • 在程式設計中,封裝(Encapsulation)是對具體對象的一種抽象,即將某些部分隱藏起來,在程式外部看不到,其含義是其他程式無法調用。要瞭解封裝,離不開“私有化”,就是將類或者是函數中的某些屬性限制在某個區域之內,外部無法調用。
  • 封裝的作用:
    • 1、保護隱私(把不想別人知道的東西封裝起來)
    • 2、隔離複雜度(比如:電視機,我們看見的就是一個黑匣子,其實裡面有很多電器元件,對於用戶來說,我們不需要清楚裡面都有些元件,電視機把那些電器元件封裝在黑匣子里,提供給用戶的只是個按鈕介面,通過按鈕就能實現對電視機的操作。)
  • 封裝其實分為兩個層面,但無論哪種層面的封裝,都要對外界提供好訪問你內部隱藏內容的介面(介面可以理解為入口,有了這個入口,使用者無需且不能夠直接訪問到內部隱藏的細節,只能走介面,並且我們可以在介面的實現上附加更多的處理邏輯,從而嚴格控制使用者的訪問)
    • 第一個層面的封裝(什麼都不用做):創建類和對象會分別創建二者的名稱空間,我們只能用類名.或者obj.的方式去訪問裡面的名字,這本身就是一種封裝。
    • 第二個層面的封裝:類中把某些屬性和方法隱藏起來(或者說定義成私有的),只在類的內部使用、外部無法訪問,或者留下少量介面(函數)供外部訪問。
class Person:
    def __init__(self, name, age):
        self.__name = name
        self.age = age

    # 私有方法
    def __getname(self):
        # print(self.__name)
        print(f'{self.__name}')

    # 實例方法
    def printinfo(self):
        print(f'{self.__name},{self.age}')

p = Person('zhangsan', 18)
p.printinfo()

繼承

  • 繼承是面向對象程式設計的重要特征,也是實現代碼復用的重要手段,如果一個新類繼承自一個設計好的類,就直接具備了已有類的特征,就大大降低了工作難度。已有的類,我們稱為父類或者基類,新的類,我們稱為子類或者派生類。

單繼承

單繼承指的是子類只繼承一個父類 當對象調用方法時,查找順序先從自身類找,如果自身沒找到,則去父類找,父類無,再到父類的父類找,直到object類,若還無,則報錯。這也稱為 深度優先機制。
image.png

# 單繼承
class Grandfather:
    def __init__(self):
        print('Grandfather')

    def sleep(self):
        print("sleep")

class Father(Grandfather):
    def eat(self):
        print("eat")

    def drink(self):
        print("drink")

class Son(Father):
    def study_python(self):
        print("python")

s = Son()
s.study_python()
s.eat()
s.sleep()

多繼承

多繼承指的是子類繼承了多個父類。並且具有它們的特征。
image.png

"""情景1"""
class Father1:
    def run(self):
        print("father1 run")

class Father2:
    def run(self):
        print("father2 run")

class Son(Father1, Father2):  # 擁有相同方法時,左邊優先執行
    pass

s = Son()
s.run()

image.png

"""情景2"""
class Grandfather:
    def sleep(self):
        print("Grandfather sleep")

class Father1(Grandfather):
    def run(self):
        print("father1 run")

class Father2:
    def sleep(self):
        print(" Father2 sleep")

class Son(Father1, Father2):  # 必須要左邊的執行完了,才會執行右邊的父類
    pass

s = Son()
s.sleep()

image.png

"""情景3"""
class Grandfather1:
    def sleep(self):
        print("sleep 12")

class Father1(Grandfather1):
    def run(self):
        print("father1 run")

class Father2(Grandfather1):
    def sleep(self):
        print("sleep 6")

class Son(Father1, Father2):  # 如果同根的話,根是最後才執行的
    pass

s = Son()
s.sleep()


print(Son.__mro__)  # 通過mro方法可以程式執行或者繼承順序的情況
# (<class '__main__.Son'>, <class '__main__.Father1'>, <class '__main__.Father2'>, <class '__main__.Grandfather1'>, <class 'object'>)

方法的重寫

當子類與父類擁有同名稱的方法時,子類對象調用該方法優先執行自身的方法。那麼實際上就是子類的方法覆蓋父類的方法,也稱為重寫。實際的開發中,遵循開放封閉原則。我們並不會完全的重寫父類的方法,而是希望同時實現父類的功能。

# 相對而言是我們B的父類
class A:
    # init同時也能夠被繼承
    def __init__(self):
        print('A')

    def test(self):
        print("aaaa")

# B繼承了A 子類
class B(A):
    def __init__(self):
        print('B')
        # A.__init__(self)
        super(B, self).__init__()

    # 子類重寫父類的同名方法
    def test(self):
        print("bbbb")
        # 對該方法進行重寫,同時實現子類和父類的功能 三個方法都可以
        # super(B, self).test()
        # super().test()
        # A.test(self)   # 通過類名.方法名 強寫 不推薦


b = B()  # 創建了B的對象
b.test()  # bbbb
"""
若將test方法里的註釋放開,則也會列印A中test方法中的aaaa
"""

多態

Python中函數的參數是沒有類型限制的,所以多態在python中的體現並不是很嚴謹。多態的概念是應用於Java和C#這一類強類型語言中,而Python崇尚“鴨子類型”。python是弱語言類型。

  • 多態(polymorphism):指的是一類事物有多種形態,一個抽象類有多個子類(因而多態的概念依賴於繼承),不同的子類對象調用相同的方法,產生不同的執行結果,多態可以增加代碼的靈活度

1、實現多態的步驟:

1)定義一個父類(Base),實現某個方法(比如:run)
2)定義多個子類,在子類中重寫父類的方法(run),每個子類run方法實現不同的功能
3)假設我們定義了一個函數,需要一個Base類型的對象的參數,那麼調用函數的時候,傳入Base類不同的子類對象,那麼這個函數就會執行不同的功能,這就是多態的體現。

class Animal(object):
    """動物類"""
    def func(self):
        print('動物發出了聲音')

class Cat(Animal):
    """貓類"""
    def func(self):
        print('喵 喵 喵')

class Dog(Animal):
    """狗類"""
    def func(self):
        print('汪 汪 汪 ')

class Hero:
    def func(self):
        print('這個是英雄類的方法,不是動物類的對象')

def work01(Animal):
    Animal.func()


work01(Dog())  # 傳入的對象 結果:汪 汪 汪 
work01(Animal())  # 動物發出了聲音
# 傳入不同的對象,產生不同的結果
# 調用靈活 更容易編寫出通用的代碼

多態的意義:

(1)在程式運行過程中展現出動態的特性,在程式編譯的時候無法知道調用哪個函數
(2)函數重寫必須多態實現,否則沒有意義
(3)多態是面向對象組件化程式設計的基礎特性

註意點:Python中函數的參數是沒有類型限制的,所以多態在python中的體現並不是很嚴謹。多態的概念是應用於Java和C#這一類強類型語言中,而Python崇尚“鴨子類型”。

鴨子類型

  • 鴨子類型概念:他並不要求嚴格的繼承體系,關註的不是對象的類型本身,而是它是否具有要調用的方法(行為)
class Duck:
    def quack(self):
        print("嘎嘎嘎嘎。。。。。")

class Bird:
    def quack(self):
        print("bird imitate duck....")

class geese:
    def quack(self):
        print("geese imitate duck....")

def in_the_forest(duck):
    duck.quack()


duck = Duck()
bird = Bird()
geese = geese()
for x in [duck, bird, geese]:
    in_the_forest(x)
"""
嘎嘎嘎嘎。。。。。
bird imitate duck....
geese imitate duck....
"""

本文來自博客園,作者:大-鍋,轉載請註明原文鏈接:https://www.cnblogs.com/daguo118/p/17347492.html


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

-Advertisement-
Play Games
更多相關文章
  • 前言 數組是幾乎所有編程語言的基礎語法,JavaScript因為語法特性,之前缺少一些集合類對象,對數組的使用就會更多一些,因此我們更需要理解數組知識。 然而大部分人對數組都已經非常熟悉了,所以本文將不會介紹數組的基礎語法和用法,而是從JavaScript中數組的一些特殊之處入手,通過這些少有特性的 ...
  • 交互設計原則有很多,《小紅書的52條設計原則》可以學習下,非常棒的輸出,值得做產品設計的童鞋學習一下。 ...
  • 說明 使用 VLD 記憶體泄漏檢測工具輔助開發時整理的學習筆記。本篇介紹 VLD 源碼的編譯。同系列文章目錄可見 《記憶體泄漏檢測工具》目錄 1. VLD 庫的依賴文件 以 vld2.5.1 版本為例,下載源碼 後,源碼包中各文件的用途可看本人另一篇博客 【VLD】源碼文件概覽。使用 vld2.5.1- ...
  • 本案例實現一個test命名空間,此命名空間內有兩個函數,分別為getName()和getNameSpace(); 聲明命名空間及函數 namespace test{ const std::string& getName()和(); const std::string& getNameSpace(); ...
  • 常量指針與指針常量 #include<iostream> using namespace std; int main() { int a = 10; int b = 20; // 常量指針與指針常量 // 1.常量指針 const修飾指針 指針的指向是可以修改的(指針變數中存的地址值可以修改) 指針 ...
  • 學習Spring源碼的建議 閱讀Spring官方文檔,瞭解Spring框架的基本概念和使用方法。 下載Spring源碼,可以從官網或者GitHub上獲取。 閱讀Spring源碼的入口類,瞭解Spring框架的啟動過程和核心組件的載入順序。 閱讀Spring源碼中的註釋和文檔,瞭解每個類和方法的作用和 ...
  • 平面上有n個點(n<=100),每個點的坐標均在-10000~10000之間,其中的一些點之間有連線。 若有連線,則表示可從一個點到達另一個點,即兩點間有通路,同路的距離為兩點間的直線距離。現在的任務是找出從一點到另一點之間的最短路徑。 小提示: 兩點的距離:如果點$A$坐標為$(x_A,y_A)$ ...
  • 本文首發於公眾號:Hunter後端 原文鏈接:Django筆記二十九之中間件介紹 這一節介紹一下 Django 的中間件。 關於中間件,官方文檔的解釋為:中間件是一個嵌入 Django 系統的 request 和 response 的鉤子框架,是一個能夠全局改變 Django 輸入/輸出的系統。 我 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...