欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python數據結構之面向對象

 更新時間:2022年01月25日 10:12:27   作者:柳小蔥  
這篇文章主要介紹了python數據結構之面向對象,在python數據結構的上一章節(jié)我們講述了python的輸入輸出控制異常,希望大家重點掌握輸出和控制,這些都是比較簡單的啦,多看看就好了,接下來我們要講的是python面向對象,需要的朋友可以參考一下

前文學習:

python數據結構:數據類型.
python數據結構輸入輸出及控制和異常.

今天我們來學習面向對象編程,面向對象這種編程方式非常重要,我們以后學習到的棧、隊列、鏈表都是通過面向對象的方式實現的。

1. 面向對象編程

定義:面向對象是按照人們客觀世界的系統(tǒng)思維方式,采用基于對象(實體)的概念建立模型 ,模擬客觀世界分析,設計,實現軟件的辦法。通過面向對象的理念使計算機軟件系統(tǒng)能與現實世界中的系統(tǒng)的一一對應。

聽到這很多同學應該會很蒙,我解釋一下幾個關鍵詞的概念:

  • 對象:一切事物都可以是對象,更準確的說,對象是一個實體,用一組可識別的特征和行為來標識,可以說對象不同的地方就是具有不同的特征與行為。
  • 類:是具有相同屬性和功能的對象抽象集合

實例:就是創(chuàng)建具體對象的過程
舉一個面向對象的例子:我們需要造一輛車,我們可能并不需要知道車的原理,我們只需要找到車的輪子,車的車架,車的發(fā)動機,然后將它們拼裝在一起即可。

在前面我們已經使用了一些內建的類來展示數據和控制結構的例子。面向對象編程語言最強大的一項特性是允許程序員(問題求解者) 創(chuàng)建全新的類來對求解問題所需的數據進行建模。

我們之前使用了抽象數據類型來對數據對象的狀態(tài)及行為進行邏輯描述。通過構建能實現抽象數據類型的類,可以利用抽象過程,同時為真正在程序中運用抽象提供必要的細節(jié)。每當需要實現抽象數據類型時,就可以創(chuàng)建新類。

2. 構建類

我們來構建一個分數類fraction類:

你這不能用除法?其實是可以,但是除法的方式python已經有自己的類了,我這里需要自己創(chuàng)建一個分數類。

所有類都應該首先提供構造方法。構造方法定義了數據對象的創(chuàng)建方式。要創(chuàng)建 Fraction 類的實例,必須調用構造方法,要創(chuàng)建一個 Fraction 對象,需要提供分子和分母兩部分數據。

class fraction: #定義一個類
    def __init__(self,top,bottom):#定義構造方法 __init__
        self.num=top
        self.den=bottom

這里解釋一下,self 是一個總是指向對象本身的特殊參數,它必須是第一 個形式參數。然而,在調用方法時,從來不需要提供相應的實際參數。如前所述,分數需要分子與分母兩部分狀態(tài)數據。構造方法中的 self.num 定義了 Fraction 對象有一個叫作 num 的內部數據對象作為其狀態(tài)的一部分。同理,self.den 定義了分母。這兩個實際參數的值在初始時,賦給了狀態(tài),使得新創(chuàng)建的 Fraction 對象能夠知道其初始值。

class fraction: #定義一個類
    def __init__(self,top,bottom):#定義構造方法 __init__
        self.num=top
        self.den=bottom
        
myfraction = fraction(3,5)#使用類創(chuàng)建一個對象。

我們可以用下面這個圖來描述,我們構造類一個類,然后通過類創(chuàng)建了一個對象。

一般情況下,我們定義了一個類,里面會有這個類的一些方法,例如,我要查看這個分數對象的樣子,我要計算這中類型的分數,等等方法,這些都需要我們去定義。

class fraction: #定義一個類
    def __init__(self,top,bottom):#定義構造方法 __init__
        self.num=top
        self.den=bottom
        
    def show(self): #定義輸出方法
        print(self.num,"/",self.den)
        
    def add(self,otherf): #定義分數加法
        bot=otherf.den * self.den
        top=self.num * otherf.den +self.den * otherf.num
        print(top,"/",bot)

#定義兩個分數
myfraction=fraction(9,16)
a=fraction(1,16) 

#試試加法
myfraction.add(a)

結果如下:

這里我們放上我們寫好的分數類定義方法。

class Fraction:
    def __init__(self, top, bottom):
        self.num = top
        self.den = bottom
    def __str__(self):
        return str(self.num) + "/" + str(self.den)

    def show(self):        
        print(self.num, "/", self.den)

    def __add__(self, otherfraction): #加法 ,可以用+
        newnum = self.num * otherfraction.den + self.den * otherfraction.num
        newden = self.den * otherfraction.den
        common = gcd(newnum, newden)
        return Fraction(newnum//common, newden//common)

    def __eq__(self, other): #深相等,值相等就相等
        firstnum = self.num * other.den
        secondnum = other.num * self.den
        return firstnum == secondnum

3. 繼承

繼承是面向對象編程的一個重要特征:使一個類與另一個類相關聯,就像人們相互聯系一樣。孩子從父母那里繼承了特征,python的子類可以從父類那繼承數據和行為,父類也稱為超類。

就拿我們前面學習過的基礎數據結構舉例。

列表、字符串和元組都是有序集合。它們都繼承了共同的數據組織和操作。不過,根據數據是否同類以及集合是否可修改,它們彼此又有區(qū)別。子類從父類繼承共同的特征,但是通過額外的特征彼此區(qū)分。

3.1 繼承案例

我們這里通過一個小的案例來實現繼承的案例,我們來構建一個模擬程序,用于模擬數字電路。邏輯門是這個模擬程序的基本構造單元,它們代表其輸入和輸出之間的布爾代數關系。

通過不同的模式將這些邏輯門組合起來并提供一系列輸入值,可以構建具有邏輯功能的電 路。圖 1-10 展示了一個包含兩個與門、一個或門和一個非門的電路。兩個與門的輸出直接作為 輸入傳給或門,然后其輸出又輸入給非門。如果在 4 個輸入處(每個與門有兩個輸入)提供一系列值,那么非門就會輸出結果。

為了實現電路,首先需要構建邏輯門的表示??梢暂p松地將邏輯門組織成類的繼承層次結構, 如圖所示。頂部的 LogicGate 類代表邏輯門的通用特性:邏輯門的標簽和一個輸出。下面 一層子類將邏輯門分成兩種:有一個輸入的邏輯門和有兩個輸入的邏輯門。再往下,就是具體的邏輯門。

首先定義父類LogicGate

class LogicGate:
    def __init__(self, n):#構造函數,label代表的是自己的名字
        self.label = n
        self.output = None
    def getLabel(self):#輸出名字的函數
        return self.label
    def getOutput(self):#輸出的結果
        self.output = self.performGateLogic() 
        return self.output

目前還不用實現 performGateLogic 函數。原因在于,我們不知道每一種邏輯門將如何進 行自己的邏輯運算。這些細節(jié)會交由繼承層次結構中的每一個邏輯門來實現。這是一種在面向對象編程中非常強大的思想——我們創(chuàng)建了一個方法,而其代碼還不存在。參數 self 是指向實際調用方法的邏輯門對象的引用。任何添加到繼承層次結構中的新邏輯門都僅需要實現之后會被調用的 performGateLogic 函數。一旦實現完成,邏輯門就可以提供運算結果。擴展已有的繼承層次結構并提供使用新類所需的特定函數,這種能力對于重用代碼來說非常重要。

定義子類BinaryGate類、UnaryGate類

兩個類中的構造方法首先使用 super 函數 來調用其父類的構造方法。當創(chuàng)建 BinaryGate 類的實例時,首先要初始化所有從LogicGate 中繼承來的數據項,在這里就是邏輯門的標簽。接著,構造方法添加兩個輸入(pinA 和 pinB)。 這是在構建類繼承層次結構時常用的模式。子類的構造方法需要先調用父類的構造方法,然后再 初始化自己獨有的數據。

BinaryGate類主要是與門和或門(有兩個輸入)

class BinaryGate(LogicGate):
    def __init__(self, n):
        super().__init__(n)#繼承父類的構造方法
        self.pinA = None #添加自己的參數
        self.pinB = None
            
    def getPinA(self):#自己的方法
        return int(input("Enter Pin A input for gate "+self.getLabel() + "-->"))

    def getPinB(self):#自己的方法
        return int(input("Enter Pin B input for gate "+self.getLabel() + "-->"))

UnaryGate類主要是非門(只有一個輸入)。

class UnaryGate(LogicGate):
    def __init__(self, n):
        super().__init__(n)#繼承父類的構造方法
        self.pin = None#添加自己的參數
    def getPin(self):#自己的方法
        return int(input("Enter Pin input for gate " + self.getLabel() + "-->"))

構造孫類(與門、或門、非門)

與門 AndGate類

#構造與門
class AndGate(BinaryGate): 
    def __init__(self, n):
        super().__init__(n)#繼承父類方法
    def performGateLogic(self):#自己的運算邏輯
        a = self.getPinA()
        b = self.getPinB()
        if a==1 and b==1:
            return 1
        else:
            return 0

或門 OrGate

class OrGate(BinaryGate): 
    def __init__(self, n):
        super().__init__(n)#繼承父類方法
    def performGateLogic(self):
        a = self.getPinA()
        b = self.getPinB()
        if a==1 or b==1:
            return 1
        else:
            return 0

非門 NotGate

class NotGate(UnaryGate): 
    def __init__(self, n):
        super().__init__(n)
    def performGateLogic(self):
        a = self.getPin()
        if a==1:
            return 0
        else:
            return 1

測試一下結果:

與門

或門

非門

參考資料:

  • 《python數據結構與算法》
  • 《大話數據結構》

到此這篇關于python數據結構之面向對象的文章就介紹到這了,更多相關python面向對象內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • matplotlib繪制兩點間連線的幾種方法實現

    matplotlib繪制兩點間連線的幾種方法實現

    本文主要介紹了matplotlib繪制兩點間連線的幾種方法實現,主要介紹了4種方法,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 解決pandas展示數據輸出時列名不能對齊的問題

    解決pandas展示數據輸出時列名不能對齊的問題

    今天小編就為大家分享一篇解決pandas展示數據輸出時列名不能對齊的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python 時間處理之月份加減問題

    python 時間處理之月份加減問題

    這篇文章主要介紹了python 時間處理之月份加減問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Python實現配置文件備份的方法

    Python實現配置文件備份的方法

    這篇文章主要介紹了Python實現配置文件備份的方法,實例分析了基于Linux平臺下Python文件壓縮備份的相關技巧,具有一定參考借鑒價值
    2015-07-07
  • pytorch中函數tensor.numpy()的數據類型解析

    pytorch中函數tensor.numpy()的數據類型解析

    這篇文章主要介紹了pytorch中函數tensor.numpy()的數據類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • 一文讀懂Python的’=='和’is’用法

    一文讀懂Python的’=='和’is’用法

    探索Python世界的'=='與'is',一個看似簡單卻隱藏玄機的話題,本指南將帶你輕松讀懂它們背后的故事,解鎖編程中的這道難題,開始我們的快速之旅,釋放代碼的潛能吧!
    2024-01-01
  • python中threading超線程用法實例分析

    python中threading超線程用法實例分析

    這篇文章主要介紹了python中threading超線程用法,實例分析了Python中threading模塊的相關使用技巧,需要的朋友可以參考下
    2015-05-05
  • 這十大Python庫你真應該知道

    這十大Python庫你真應該知道

    這篇文章主要為大家詳細介紹了十大Python庫,學習數據分析應該弄清楚該學習什么技能,該使用哪種工具,本文具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Python 中的with關鍵字使用詳解

    Python 中的with關鍵字使用詳解

    這篇文章主要介紹了Python 中的with關鍵字使用詳解的相關資料,在Python中,with關鍵字是一個替你管理實現上下文協議對象的好東西,需要的朋友可以參考下
    2016-09-09
  • Python文本的藝術字符串處理技巧掌握

    Python文本的藝術字符串處理技巧掌握

    這篇文章主要為大家介紹了Python文本的藝術字符串處理技巧掌握,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11

最新評論