導航:首頁 > 編程語言 > python面向對象繼承

python面向對象繼承

發布時間:2023-05-13 11:49:10

1. python之面向對象

面向對象(OOP)是一種對現實世界理解和抽象的方法,對象的含義是指在現實生活中的具體事物, 一切皆對象 ,Python 是一門面向對象的語言,面向對象編程簡單來說就是一種 封裝代碼 的方式。

Python 中類的定義使用 class 關鍵字定義類,語法如下所示:

舉例,定義一個類 Cat

構造方法 init() 會在類實例化時自動調用。無論構造方法還是其他方法都需要將 self 作為第一個參數,它代表類的實例。

類創建好後,可以直接通過類名訪問屬性,格式為: 類名.屬性名 ,比如我們訪問 Cat 類的 color 屬性,如下所示:

創建對象也稱類的實例化,比如我們通過 Cat 類創建對象,如下所示:

創建好對象後,使用它訪問屬性和調用方法了,如下所示:

內部私有屬性和方法是可以被訪問和調用的。

我們來一起看個例子,如下所示:

輸出結果:

Python 支持類的繼承,而且支持多繼承,語法格式為:

示例如下所示:

如果繼承的父類方法不能滿足我們的需求,這時子類可以 重寫 父類方法,如下所示:

2. Python的類和對象入門

本文來說說Python中的類與對象,Python這門語言是無處不對象,如果你曾淺要了解過Python,你應該聽過Python是一種面向對象編程的語言,所以你經常可能會看到面向「對象」編程這類段子,而面向對象編程的語言都會有三大特徵:封裝、繼承、多態。

我們平時接觸到的很多函數、方法的操作都具有這些性質,我們只是會用,但還沒有去深入了解它的本質,下面就介紹一下關於類和對象的相關知識。

封裝這個概念應該並不陌生,比如我們把一些數據封裝成一個列表,這就屬於數據封裝,我們也可以將一些代碼語句封裝成一個函數方便調用,這就是代碼的封裝,我們也可以將數據和代碼封裝在一起。用術語表示的話,就是可以將屬性和方法進行封裝,從而得到對象。

首先我們可以定義一個類,這個類中有屬性和方法,但有的夥伴會比較好奇,屬性和方法不是會封裝成對象嘛,為什麼又變成類了?舉個例子,類就好比是一個毛坯房,而對象是在毛坯房的基礎上改造成的精裝房。

在類定義完成時就創建了一個類對象,它是對類定義創建的命名空間進行了一個包裝。類對象支持兩種操作:屬性引用和實例化。

屬性引用的語法就是一般的標准語法:obj.name。比如XiaoMing.height和XiaoMing.run就是屬性引用,前者會返回一條數據,而後者會返回一個方法對象。

這里也支持對類屬性進行賦值操作,比如為類中的weight屬性賦予一個新值。

而類的實例化可以將類對象看作成一個無參函數的賦值給一個局部變數,如下:

ming就是由類對象實例化後創建的一個實例對象,通過實例對象也可以調用類中的屬性和方法。

類在實例化過程中並不都是像上面例子一樣簡單的,一般類都會傾向將實例對象創建為有初始狀態的,所以在類中可能會定義一個__init__的魔法方法,這個方法就可以幫助接收、傳入參數。

而一個類如果定義了__init__方法,那麼在類對象實例化的過程中就會自動為新創建的實例化對象調用__init__方法,請看下面這個例子。

可以看到在__init__()中傳入了參數x和y,然後在print_coor中需要接收參數x和y,接下來通過實例化這個類對象,驗證一下參數是否能通過__init__()傳遞到類的實例化操作中。

所謂繼承就是一個新類在另一個類的基礎上構建而成,這個新類被稱作子類或者派生類,而另一個類被稱作父類、基類或者超類,而子類會繼承父類中已有的一些屬性和方法。

比如上面這個例子,我並沒有將list_定義成一個列表,但它卻能調用append方法。原因是類Mylist繼承於list這個基類,而list_又是Mylist的一個實例化對象,所以list_也會擁有父類list擁有的方法。當然可以通過自定義類的形式實現兩個類之間的繼承關系,我們定義Parent和Child兩個類,Child中沒有任何屬性和方法,只是繼承於父類Parent。

當子類中定義了與父類中同名的方法或者屬性,則會自動覆蓋父類對應的方法或屬性,還是用上面這個例子實現一下,方便理解。

可以看到子類Child中多了一個和父類Parent同名的方法,再實例化子類並調用這個方法時,最後調用的是子類中的方法。Python中繼承也允許多重繼承,也就是說一個子類可以繼承多個父類中的屬性和方法,但是這類操作會導致代碼混亂,所以大多數情況下不推薦使用,這里就不過多介紹了。

多態比較簡單,比如定義兩個類,這兩個類沒有任何關系,只是兩個類中有同名的方法,而當兩個類的實例對象分別調用這個方法時,不同類的實例對象調用的方法也是不同的。

上面這兩個類中都有introce方法,我們可以實例化一下兩個類,利用實例對象調用這個方法實現一下多態。

判斷一個類是否是另一個類的子類,如果是則返回True,反之則返回False。

需要注意的有兩點:

判斷一個對象是否為一個類的實例對象,如果是則返回True,反之則返回False。

需要注意的有兩點:

判斷一個實例對象中是否包含一個屬性,如果是則返回True,反之則返回False。

需要注意的是第二個參數name必須為字元串形式傳入,如果不是則會返回False。

3. Python語言是面向對象的語言嗎

是的,Python是面向對象的編程語言,並具備以下特徵:
封裝
面向對象程序設計中的術語對象(Object)基本上可以看做數據(特性)以及由一系列可以存取、操作這些數據的方法所組成的集合。傳統意義上的「程序=
數據結構+演算法」被封裝」掩蓋「並簡化為「程序=對象+消息」。對象是類的實例,類的抽象則需要經過封裝。封裝可以讓調用者不用關心對象是如何構建的而直接進行使用。
繼承
類繼承:
繼承給人的直接感覺是這是一種復用代碼的行為。繼承可以理解為它是以普通的類為基礎建立專門的類對象,子類和它繼承的父類是IS-A的關系。
多重繼承:
不同於C#,Python是支持多重類繼承的(C#可繼承自多個Interface,但最多繼承自一個類)。多重繼承機制有時很好用,但是它容易讓事情變得復雜。
多態
多態意味著可以對不同的對象使用同樣的操作,但它們可能會以多種形態呈現出結果。在Python中,任何不知道對象到底是什麼類型,但又需要對象做點什麼的時候,都會用到多態。方法是多態的,運算符也是多態的。

4. Python 面向對象的核心概念匯總


1)、將公共的屬性和方法放到父類中,自己只考慮特有的屬性和方法。

2)、覆蓋父類的方法即重寫父類方法,在運行中只會調用子類中重寫的方法不用調用父類中的方法。

3)、子類擁有一個父類叫作單繼承,子類可以擁有多個父類,並且具有所有父類的屬性和方法。

1)、指的是為不同的基礎形態(數據類型)提供著介面的能力,介面指的是函數和方法。

2)、顧名思義,多態就是多種表現形態的意思,它是一種機制,一種能力,而非某個關鍵詞。它在類的繼承中得以實現,在類的方法調用中得以體現。

3)、多態意味著變數並不知道引用的對象是什麼,根據引用對象的不同表現不同的行為方式。

4)、多態以封裝和繼承為前提,不同的子類對象調用相同的方法,產生不同的執行效果。它可以增加代碼的靈活度,以繼承和重寫父類的方法為前提,調用方法不會影響到類的內部設計

1)、通過組合技巧將一個對象作用變數保存在另一個對象中,可以模擬擁有關系。

2)、它是一種將對象或類組合成更復雜的數據結構或構件實現的方法。

3)、在組合中,一個對象可用於調用其他模塊中的成員函數,這樣一來,無需通過繼承就可以實現基本功能的跨模塊調用。


總結:

今天和大家分享的是面向對象編程的核心概念:封裝,抽象,多態、繼承、組合,可以結合代碼示例本地去運行著感受這些概念的含義。

5. Python中的面向對象(進階)

一、實例方法,類方法,靜態方法

我們首先寫一個類,裡麵包含這三種方法。

可以看到,我們用到了兩個裝飾器。

我們用類和實例分別調用下類方法

我們用類和實例分別調用下靜態方法

靜態方法其實就是把一個普通的函數寫在類里,與直接在外層寫一個函數是一樣的,本質上是一個函數。

為了方便理解,我們分別列印下這些方法的類型

通過type()查看對象是方法還是函數

此外,還可以通過inspect模塊判斷某個對象是否是某種類型,返回布爾值。

用法


小Tips:概念理解

直接def定義的,我們叫做函數

把函數放到類里,我們叫做方法

方法可以通過裝飾器staticmethod轉為(放在方法里的)函數

繼承

一個類繼承另一個類時,會自動獲得另一個類的所有屬性和方法,被繼承的類稱之為父類,新類稱為子類。子類擁有父類所有的屬性和方法,並且可以定義自己的屬性和方法

我們以上邊的Rectangle類為父類來試一下


1)完全繼承

可以看到,子類完全繼承父類後,可以直接調用父類的所有方法。

2)部分繼承

部分繼承:繼承父類後,修改父類的同名方法

我們試一下,Square繼承Rectangle後,修改__init__()方法

3)拓展父類的方法

在保留父類中某個方法的代碼同時,對方法進行拓展

可以在方法中加入"super().方法名"來實現


4)@property

6. Python中的面向對象(高級)之私有方法、多繼承、多態

特徵:私有屬性與私有方法不能從外部被調用,也不能被子類繼承

唯一寫法:在屬性或方法前面加上__(兩個下劃線)

我們寫一個簡單的例子,創建一個類,包含私有方法、私有屬性、普通方法、普通屬性,並生成一個實例

私有屬性和私有方法可以從內部被調用(總不能我寫了,但是哪都不讓用吧)

我們試試在類里再加入一個新的方法,調用私有方法和屬性

可以看到,私有屬性和私有方法是可以在類內部被調用的。

舉個私有屬性應用場景的例子


二。object類

我們試一下


三。多繼承

一個子類可以繼承多個父類,用逗號隔開

多個父類中有同名方法時,按照繼承順序進行調用


四。多態

當不同的實例,有同名的方法時,我們可以一個函數,傳入不同的實例,執行對應的方法。

我們定義一個貓和一個狗的類,兩個類中都有'叫'的方法。並各生成一個實例。

定義一個函數,用函數來調用'叫'的方法

這就叫多態。

7. Python面向對象編程之繼承與多態詳解

Python面向對象編程之繼承與多態詳解
本文實例講述了Python面向對象編程之繼承與多態。分享給大家供大家參考,具體如下:
Python 類的繼承
在OOP(Object Oriented Programming)程序設計中,當我們定義一個class的時候,可以從某個現有的class 繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。
我們先來定義一個class Person,表示人,定義屬性變數 name 及 sex (姓名和性別);
定義一個方法print_title():當sex是male時,print man;當sex 是female時,print woman。參考如下代碼:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person): # Child 繼承 Person
pass
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex) # 子類繼承父類方法及屬性
May.print_title()
Peter.print_title()

而我們編寫 Child 類,完全可以繼承 Person 類(Child 就是 Person);使用 class subclass_name(baseclass_name) 來表示繼承;

繼承有什麼好處?最大的好處是子類獲得了父類的全部屬性及功能。如下 Child 類就可以直接使用父類的 print_title() 方法

實例化Child的時候,子類繼承了父類的構造函數,就需要提供父類Person要求的兩個屬性變數 name 及 sex:

在繼承關系中,如果一個實例的數據類型是某個子類,那它也可以被看做是父類(May 既是 Child 又是 Person)。但是,反過來就不行(Peter 僅是 Person,而不是Child)。

繼承還可以一級一級地繼承下來,就好比從爺爺到爸爸、再到兒子這樣的關系。而任何類,最終都可以追溯到根類object,這些繼承關系看上去就像一顆倒著的樹。比如如下的繼承樹:

isinstance() 及 issubclass()

Python 與其他語言不同點在於,當我們定義一個 class 的時候,我們實際上就定義了一種數據類型。我們定義的數據類型和Python自帶的數據類型,比如str、list、dict沒什麼兩樣。

Python 有兩個判斷繼承的函數:isinstance() 用於檢查實例類型;issubclass() 用於檢查類繼承。參見下方示例:

class Person(object):
pass
class Child(Person): # Child 繼承 Person
pass
May = Child()
Peter = Person()
print(isinstance(May,Child)) # True
print(isinstance(May,Person)) # True
print(isinstance(Peter,Child)) # False
print(isinstance(Peter,Person)) # True
print(issubclass(Child,Person)) # True

Python 類的多態

在說明多態是什麼之前,我們在 Child 類中重寫 print_title() 方法:若為male,print boy;若為female,print girl
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person): # Child 繼承 Person
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
May = Child("May","female")
Peter = Person("Peter","male")
print(May.name,May.sex,Peter.name,Peter.sex)
May.print_title()
Peter.print_title()

當子類和父類都存在相同的 print_title()方法時,子類的 print_title() 覆蓋了父類的 print_title(),在代碼運行時,會調用子類的 print_title()

這樣,我們就獲得了繼承的另一個好處:多態。

多態的好處就是,當我們需要傳入更多的子類,例如新增 Teenagers、Grownups 等時,我們只需要繼承 Person 類型就可以了,而print_title()方法既可以直不重寫(即使用Person的),也可以重寫一個特有的。這就是多態的意思。調用方只管調用,不管細節,而當我們新增一種Person的子類時,只要確保新方法編寫正確,而不用管原來的代碼。這就是著名的「開閉」原則:

對擴展開放(Open for extension):允許子類重寫方法函數

對修改封閉(Closed for modification):不重寫,直接繼承父類方法函數

子類重寫構造函數

子類可以沒有構造函數,表示同父類構造一致;子類也可重寫構造函數;現在,我們需要在子類 Child 中新增兩個屬性變數:mother 和 father,我們可以構造如下(建議子類調用父類的構造方法,參見後續代碼):
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person): # Child 繼承 Person
def __init__(self,name,sex,mother,father):
self.name = name
self.sex = sex
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)

若父類構造函數包含很多屬性,子類僅需新增1、2個,會有不少冗餘的代碼,這邊,子類可對父類的構造方法進行調用,參考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
class Child(Person): # Child 繼承 Person
def __init__(self,name,sex,mother,father):
Person.__init__(self,name,sex) # 子類對父類的構造方法的調用
self.mother = mother
self.father = father
May = Child("May","female","April","June")
print(May.name,May.sex,May.mother,May.father)

多重繼承

多重繼承的概念應該比較好理解,比如現在需要新建一個類 baby 繼承 Child , 可繼承父類及父類上層類的屬性及方法,優先使用層類近的方法,代碼參考如下:
class Person(object):
def __init__(self,name,sex):
self.name = name
self.sex = sex
def print_title(self):
if self.sex == "male":
print("man")
elif self.sex == "female":
print("woman")
class Child(Person):
pass
class Baby(Child):
pass
May = Baby("May","female") # 繼承上上層父類的屬性
print(May.name,May.sex)
May.print_title() # 可使用上上層父類的方法
class Child(Person):
def print_title(self):
if self.sex == "male":
print("boy")
elif self.sex == "female":
print("girl")
class Baby(Child):
pass
May = Baby("May","female")
May.print_title() # 優先使用上層類的方法

閱讀全文

與python面向對象繼承相關的資料

熱點內容
鴻蒙加密等級 瀏覽:802
cocos2dluapdf 瀏覽:491
假的加密鎖靠譜嗎 瀏覽:176
經營聖手伺服器怎麼調 瀏覽:749
arduino手機編程 瀏覽:481
西醫pdf下載 瀏覽:29
後浪電影學院pdf 瀏覽:813
程序員怎麼做到不被人嫉妒 瀏覽:669
cmd新建文件夾md命令 瀏覽:570
php數組中的數值排序 瀏覽:832
安卓手機怎麼避免小孩內購 瀏覽:171
聯想伺服器出現黃色嘆號怎麼辦 瀏覽:991
約翰編譯器製作教程 瀏覽:130
大地pdf 瀏覽:109
pdfplus 瀏覽:577
匯編O命令 瀏覽:970
plt轉pdf 瀏覽:366
魔獸60宏命令大全 瀏覽:480
php志願者網站源碼 瀏覽:875
貿易pdf 瀏覽:498