python面向對象之繼承/多態/封裝

来源:https://www.cnblogs.com/frx9527/archive/2018/06/06/python_oop3attr.html
-Advertisement-
Play Games

老師說,按繼承/多態/封裝這個順序來講。 子類使用父類的方法: 繼承的例子: 繼承順序: 多態的例子: ...


老師說,按繼承/多態/封裝這個順序來講。

子類使用父類的方法:

#!/usr/bin/env python
# coding:utf-8

class Vehicle:
    def __init__(self,name,speed,load,power):
        self.name = name
        self.speed = speed
        self.load = load
        self.power = power

    def run(self):
        print("開動啦。")


class Benz(Vehicle):
    def __init__(self,name,speed,load,power,color):
        # Vehicle.__init__(self,name,speed,load,power) # 使用指定類名方式調用了父類方法
        # super(__class__.self).__init__(name,speed,load,power) # 使用super(__class__.self)方式
        super().__init__(name,speed,load,power) # 採用super()不傳參數的方法
        self.color=color

    def show_info(self):
        print(self.name,self.speed,self.load,self.power,self.color)

    def run(self):
        # Vehicle.run(self) # 使用指定類名稱的方式,調用了父類方法
        super().run()
        print("%s %s 出發啦." % (self.color,self.name))


car1 = Benz("GLK 300","120","5人","2.4T","black")
car1.show_info()
car1.run()

 

繼承的例子:

#!/usr/bin/env python
# coding:utf-8

'''
組合與繼承都是有效地利用已有類的資源的重要方式。但是二者的概念和使用場景皆不同,

1.繼承的方式

通過繼承建立了派生類與基類之間的關係,它是一種'是'的關係,比如白馬是馬,人是動物。

當類之間有很多相同的功能,提取這些共同的功能做成基類,用繼承比較好,比如老師是人,學生是人

2.組合的方式

用組合的方式建立了類與組合的類之間的關係,它是一種‘有’的關係,比如教授有生日,教授教python和linux課程,教授有學生s1、s2、s3...

當類之間有顯著不同,並且較小的類是較大的類所需要的組件時,用組合比較好
'''

class Dad:
    '這個是爸爸類'
    money=10
    def __init__(self,name):
        print('父類')
        self.name=name
    def hit_son(self):
        print('%s 正在打兒子' %self.name)


# class Son(Dad):
#     pass
#
# # print(Son.money)
# # Son.hit_son()  # 繼承了父類的數據屬性和函數屬性
# s1=Son('alex')
# s1.hit_son()
# print(s1.name)
# print(Dad.__dict__)
# print(Son.__dict__)


class Son(Dad):
    money = 1000000009
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def hit_son(self):
        print('來自子類')

s1 = Son('Jerry',12)
print(s1.money)
print(Dad.money) # 子類在自己裡面定義了與父類同名的屬性,並沒有覆蓋父類的屬性
s1.hit_son()

print(s1.__dict__)

 

繼承順序:

#!/usr/bin/env python
# coding:utf-8

## 繼承的順序

class A:
    def test(self):
        print("A")

class B(A): # 單繼承
    # def test(self):
    #     print("B")
    pass

class C(A):
    def test(self):
        print("C")
    pass

class D(B):
    # def test(self):
    #     print("D")
    pass

class E(C):
    # def test(self):
    #     print("E")
    pass

class F(D,E): # 多繼承
    # def test(self):
    #     print("F")
    pass

f1 = F()
f1.test()
# 新式類查找順序 F >> D >> B >> E >> C >> A
# 經典類查找順序 F >> D >> B >> A >> E >> C

print(F.__mro__) # python2中經典類沒有 __mro__

## 如果繼承關係為菱形結構,那麼屬性的查找方式有兩種,分別是:深度優先和廣度優先
## 經典類時,要查找的屬性不存在時,多繼承會按照深度優先的方式查找
## 新式類時,要查找的屬性不存在時,多繼承會按照廣度優先的方式查找,最後找到object

 

多態的例子:

#!/usr/bin/env python
# coding:utf-8

## 多態
## python本身就是多態的.
# 由不同的類實例化得到的對象,調用同一個方法,執行的邏輯不同
# 指出了對象如何通過他們共同的屬性和動作來操作及訪問,而不需要考慮它們具體的類。
# 表明瞭動態綁定的存在,允許重載及運行時類型確定和驗證。
# 體現在調用不同對象的共同方法時,才能展現出來。

class H2O:
    def __init__(self,name,temperature):
        self.name=name
        self.temperature=temperature
    def turn_ice(self):
        if self.temperature < 0:
            print('[%s]溫度太低結冰了' %self.name)
        elif self.temperature > 0 and self.temperature < 100:
            print('[%s]液化成水' %self.name)
        elif self.temperature > 100:
            print('[%s]溫度太高變成了水蒸氣' %self.name)

class Water(H2O):
    pass
class Ice(H2O):
    pass
class Steam(H2O):
    pass

w1=Water('',25)
i1=Ice('',-20)
s1=Steam('蒸汽',3000)

# 下麵三個對象調用了相同的方法,但是得到的結果卻不一樣。
w1.turn_ice()
i1.turn_ice()
s1.turn_ice()

 


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

-Advertisement-
Play Games
更多相關文章
  • 題目描述 計算積分 結果保留至小數點後6位。 數據保證計算過程中分母不為0且積分能夠收斂。 輸入輸出格式 輸入格式: 一行,包含6個實數a,b,c,d,L,R 輸出格式: 一行,積分值,保留至小數點後6位。 輸入輸出樣例 輸入樣例#1: 複製 1 2 3 4 5 6 輸出樣例#1: 複製 2.732 ...
  • 當我們談論到應用程式的架構的時候,經常會問到一個經典的問題,那就是“這段代碼應該放在哪裡比較好”。 因為 Laravel 是一個相當靈活的框架,所以要回答這個問題其實沒那麼容易。我應該把我的業務邏輯寫在 Model 層,還是 Controller 層,或者是其他地方? 當你的應用程式僅有一個接入點, ...
  • 繼上一篇自己動手寫Java String類之後,今晚10點鐘下班,感覺稍早,於是手癢癢就想自己動手來寫StringBulder,畢竟程式員啥都講究自己動手才能豐衣足食嘛!StringBuilder與String類的區別是String的變數內容是放在final char[]裡面的,而StringBui... ...
  • java 類修飾符:通常情況下使用 public 修飾,此時,java 強制要求 .java 文件名需與該 public 修飾類名一致,否則無法編譯通過。如若沒有加修飾符,文件名與類名可無任何關聯。 .java 文件建議僅聲明單個類,不要在同一個類文件,創建多個類。 PATH 添加時,可旋轉在當前 ...
  • 1 import java.io.File; 2 import java.text.DateFormat; 3 import java.util.Date; 4 5 public class FileDemo { 6 public static void main(String[] args) th... ...
  • Java中static使用方法一:Java中的static使用之靜態變數;二:Java中的static使用之靜態方法;三:Java中的static使用之靜態初始化快; ...
  • 曾經有人問我,為什麼要學習Python!我說:"因為我想學習爬蟲!""那你為什麼學習爬蟲呢?""因為可以批量下載很多很多妹子圖!"其實我都是為了學習,都是為了讓自己能更好的掌握Python,練手的項目!Emmmmm....沒錯,是為了學習 除了Python還能用什麼語言寫爬蟲? C,C++。高效率, ...
  • 一: 二: ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...