導航:首頁 > 編程語言 > python多態的定義

python多態的定義

發布時間:2024-04-24 17:54:28

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中的面向對象(高級)之私有方法、多繼承、多態

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

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

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

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

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

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

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


二。object類

我們試一下


三。多繼承

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

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


四。多態

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

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

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

這就叫多態。

㈢ Python中的多態

times函數為例談談多態,就像我們看到的那樣,times函數中表達式×*y的意義完全取決於x和y的對象類型,同樣的函數,在一個實例下執行的是乘法,在另一個實例下執行的卻是重復。Python把對某一對象在某種語法下的合理性交給那個對象自身來判斷。實際上,*作為一個分派機制,將執行的控制權移交給被處理的對象。
這種依賴類型的行為稱為多態,其含義就是一個操作的意義取決於被操作對象的類型。因為Python是動態類型語言,所以多態在Python中隨處可見。事實上,在 Python中所有操作都是多態的操作:print、index、*運算符,以及更多。這實際上是有意而為的,並且從很大程度上算作是這門語言簡潔性和靈活性的一個表現。例如,函數可以自動地應用到所有類別的對象上。只要對象支持所預期的介面(也稱為協議),函數就能處理它們。也就是說,如果傳給函數的對象支持預期的方法和表達式運算符,那麼它們對函數的邏輯來說就是有著即插即用的兼容性。
即使是簡單的times 函數,對任意兩個支持*的對象都可以執行,無論它是哪種類型,也不管它是何時編寫的。這個函數對於數字來說是有效的(執行乘法),或者一個字元串和一個數字(執行重復),或者任意其他支持擴展介面的兼容對象——甚至是我們尚未編寫過的基於類的對象。

㈣ python的三大特徵

第一點:封裝
隱藏對象的屬性和實現細節,僅對外提供公共訪問方式,在Python中用雙下線開頭的方式將屬性設置成私有的。
擁有三個好處:將變化隔離,便於使用,提高復用性,提高安全性。
第二點:繼承
繼承是一種創建新類的方式,在Python中,新建的類可以繼承一個或多個父類,父類又被稱為基類或超類,新建的類稱為派生類或子類。即一個派生類繼承基類的欄位和方法,繼承也允許把一個派生類的對象作為一個基類對象對待。
第三點:多態
一種事物的多種體現形式,函數的重寫其實就是多態的一種體現。Python中,多態指是父類的引用指向子類的對象。
實現多態的步驟:
1. 定義新的子類;
2. 重寫對應的父類方法;
3. 使用子類的方法直接處理,不調用父類的方法;
多態的好處:
1. 增加了程序的靈活性;
2. 增加了程序的可擴展性。

㈤ python中的繼承和多態

繼承:在已有類的基礎上創建新類,這其中的一種做法就是讓一個類從另一個類那裡將屬性和方法直接繼承下來,從而減少重復代碼的編寫。
1.提供繼承信息的我們稱之為父類,也叫超類或基類;2.得到繼承信息的我們稱之為子類,也叫派生類或衍生類。3.子類除了繼承父類提供的屬性和方法,還可以定義自己特有的屬性和方法,所以子類比父類擁有的更多的能力
多態:子類在繼承了父類的方法後,通過方法重寫我們可以讓父類的同一個行為在子類中擁有不同的實現版本,這個就是多態。

㈥ python中,面向對象有哪些機制有利於代碼復用

Python中面向對象編程有以下機制有利於代碼復用:

1.繼承(Inheritance):子類可以繼承父類的屬性和方法,並且可以在不改變父類的情況下對其進行擴展或修改,從而減少代碼的重復編寫。例如,一個父類定義了通用的方法,子類可以繼承這些方法並添加特定的實現。

在這個例子中,我們定義了一個抽象基類 Animal,它有一個抽象方法 make_sound,用於定義動物的叫聲。然後我們定義了兩個子類 Dog 和 Cat,它們芹者分別實現了 make_sound 方法,以定義狗和貓的叫聲。由於它們都實現了 Animal 類的介面,所以它們有相同的行為,我們可以使用相同的方式對它們進行操作。

㈦ python中到底「多態」是什麼!!!

Python是一種純粹的面向對象語言。面向對象編程中的四大特徵分別是:抽象、封裝、繼承和多態。多態根據上下文,對象可以採用多種形式。程序將確定該對象每次執行所需的含義或用法,從而減少了重復代碼。

我國有句俗語:「龍生九子,各有不同」。這就是多態。多態是同一類事物具有的多種形態。多態是面向對象編程的重要特點之一。

Python本身就是一種多態語言:

上述程序中,調用Func()函數為同一個操作,但調用的參數是不同的,即調用了不同的實例作為參數。由運行結果可知,有不同的類創建不同的實例,以不同的實例作為參數時,調用talk()得到的列印結果是不同的,這是因為每個實例具有不同的實現方式,這就是多態性的體現。

多態性是同一個操作因作用實例不同而表現出不同實現方式的特性。多態性增加了程序的靈活性,以不變應萬變,無論實例千變萬化,使用者都是以同一種形式去調用;多態性還增加了程序可擴展性,通過繼承創建新的類,子類可以使用父類的方法,也可以使用自己重寫的方法。

關於深度學習的基礎問題可以看下這個網頁的視頻教程,網頁鏈接,希望我的回答能幫到你。

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


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

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

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

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

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

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

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

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

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

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


總結:

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

閱讀全文

與python多態的定義相關的資料

熱點內容
如何雲伺服器搭建游戲 瀏覽:560
魔獸獵人宏命令 瀏覽:432
翁虹電影大全 瀏覽:990
如何把文件夾改變為安裝包 瀏覽:299
地震勘探pdf 瀏覽:690
c語言怎樣給字元串加密 瀏覽:583
什麼網站可以看劇情 瀏覽:533
cad圖紙空間命令 瀏覽:136
GRA26K 瀏覽:479
單片機stm32實驗心得體會 瀏覽:618
php壓縮包如何安裝 瀏覽:647
免費看慢網站 瀏覽:151
外國影片女孩頭一次出去上外地 瀏覽:479
程序員創業接到小程序訂單 瀏覽:392
java復用反編譯代碼 瀏覽:552
qq聊天發送的文件在哪個文件夾 瀏覽:820
代理伺服器地址格式是什麼意思 瀏覽:444
蘇e行app為什麼會有登錄過期 瀏覽:800
傑森坐牢 下象棋是什麼電影 瀏覽:408
蘋果相機也么加密 瀏覽:891