導航:首頁 > 編程語言 > 多態的作用特點python

多態的作用特點python

發布時間:2022-12-10 11:37:49

1. 多態的好處

1、提高了代碼的維護性(繼承保證)

2、提高了代碼的擴展性(由多態保證)

多態:同一操作作用於不同的對象,可以有不同的解釋,產生不同的執行結果。在運行時,可以通過指向基類的指針,來調用實現派生類中的方法。

(1)多態的作用特點python擴展閱讀

多態作用:把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。

賦值之後,父類型的引用就可以根據當前賦值給它的子對象的特性以不同的方式運作。也就是說,父親的行為像兒子,而不是兒子的行為像父親。

多態是面向對象的重要特性,簡單點說:「一個介面,多種實現」,就是同一種事物表現出的多種形態。
編程其實就是一個將具體世界進行抽象化的過程,多態就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。

2. Python中的多態

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

3. 什麼是多態性,使用多態有什麼好處

什麼是多態?

可以這么回答:

使用多態有什麼好處?

多態在代碼中的體現:

輸出結果:
貓吃魚
貓吃魚(因為描述的是真正的是一隻貓)

拓展:

多態性:同一操作作用於不同的對象,可以用不同的解釋,產生不同的執行結果,這就是多態性。

多態性通過派生類覆寫基類中的虛函數的方法來實現。

多態性分為兩種,一種是編譯時的多態性,一種是運行時的多態性。

編譯時的多態性:編譯時多態是通過重載來實現的。對於非虛的成員來說,系統在編譯時,根據傳遞的參數,返回的類型等信息決定實現何種操作。

運行時的多態性:運行時的多態性就是指直到系統運行時,才根據實際情況決定實現何種操作。

4. 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() # 優先使用上層類的方法

5. python 多態 協議詳解

介面(python 中的協議)的多種不同的實現方式即為多態。多態的作用,就是為了類在繼承和派生的時候,保證使用「家譜」中任一類的實例的某一屬性時的正確調用。

可以看到,在上面的代碼中,只要實現了 Dock 類中的 swimming 和 Walk 方法,那麼這個類就可以被叫做 Dock 類

應用場景 如: for 循環, 在python 中 for 循環只能用於可迭代對象, 那麼, 我自己定義的類實現了 __iter__協議(介面),這個實例類就是一個可迭代對象,可以被for 循環使用

python 中定義協議類協議使用 @abstractmethod 裝飾器,@abstractmethod 裝飾過的類是不能進行初始化的,相對於c++中的純虛函數類

這個類只能當做協議(介面)類

6. python的三大特徵

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

7. Python類的繼承與多態詳細介紹

類(Class): 用來描述具有相同的屬性和方法的對象的集合。

類變數:類變數在整個實例化的對象中是公用的。類變數定義在類中且在函數體之外。類變數通常不作為實例變數使用。

類有一個名為 __init__() 的特殊方法(構造方法),該方法在類實例化時會自動調用

self:self 代表的是類的實例,代表當前對象的地址,而 self.class 則指向類。

類調用 Car.weight

實例化 car01=Car(5)

實例對象調用 car01.weght

我們在構造類時,Python3默認我們繼承了object這個基類,我個人理解object就是個空的類,可以不用管為何要在括弧中寫上object,這是Python3的特性,在python2中如果你沒有寫object的話不會默認繼承了object這個基類。

同樣的我們自己希望繼承的父類只需要把objetc改為我們自己定義的類名即可。子類中可以擁有父類中所有的公有屬性和方法,但是可以通過在變數名前加下劃線使其變為私有,這樣子類就不可以訪問父類中的成員了。

以下三個公交車類的父類均為客車類,我們可以寫一個funcs方法使得每次調用funcs方法時,傳入不同的對象以執行不同的func方法,具體實現如下:

主函數

可以看到,我將小 汽車 實例化為帶有重量為5t的一個具體對象,將客車實例化為帶有重量為20t的一個具體對象,將三個公交車實例化為帶有重量為15t的一個具體對象.

如上圖所示,我每次在調用funcs方法時都傳入了一個實例化對象,funcs根據不同的對象執行相應的內部方法。

8. 多態的作用

把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。
賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。也就是說,父親的行為像兒子,而不是兒子的行為像父親。
舉個例子:從一個基類中派生,響應一個虛命令,產生不同的結果。
比如從某個基類繼承出多個對象,其基類有一個虛方法Tdoit,然後其子類也有這個方法,但行為不同,然後這些子對象中的任何一個可以賦給其基類對象的引用,或者將子對象地址賦給基類指針,這樣其基類的對象就可以執行不同的操作了。實際上你是在通過其基類來訪問其子對象的,你要做的就是一個賦值操作。
使用繼承性的結果就是可以創建一個類的家族,在認識這個類的家族時,就是把導出類的對象當作基類的對象,這種認識又叫作upcasting。這樣認識的重要性在於:我們可以只針對基類寫出一段程序,但它可以適應於這個類的家族,因為編譯器會自動找出合適的對象來執行操作。這種現象又稱為多態性。而實現多態性的手段又叫稱動態綁定(dynamic binding)。
簡單的說,建立一個父類的對象,它的內容可以是這個父類的,也可以是它的子類的,當子類擁有和父類同樣的函數,當使用這個對象調用這個函數的時候,定義這個對象的類(也就是父類)里的同名函數將被調用,當在父類里的這個函數前加virtual關鍵字,那麼子類的同名函數將被調用。通俗點說就是父類不加virtual關鍵字,那麼子類的同名函數將會被覆蓋。OC中當一個父類對象指針指向的是一個子類對象時,調用方法時,會執行直接子類的方法。

9. 什麼是多態多態的概念及作用是什麼

  1. 概念:多態(Polymorphism)按字面的意思就是「多種狀態」。在面向對象語言中,介面的多種不同的實現方式即為多態。

    引用Charlie Calverts對多態的描述——多態性是允許你將父對象設置成為一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態性在Object Pascal和C++中都是通過虛函數實現的。

  2. 作用:

    把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。

    賦值之後,父類型的引用就可以根據當前賦值給它的子對象的特性以不同的方式運作。也就是說,父親的行為像兒子,而不是兒子的行為像父親。

    簡單的說,建立一個父類對象的引用,它所指對象可以是這個父類的對象,也可以是它的子類的對象。java中當子類擁有和父類同樣的函數,當通過這個父類對象的引用調用這個函數的時候,調用到的是子類中的函數。


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

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

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

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

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

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

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

閱讀全文

與多態的作用特點python相關的資料

熱點內容
linux安裝deb包 瀏覽:521
電腦盤文件夾如何平鋪 瀏覽:267
相機卡滿了沒文件夾 瀏覽:751
如何批量快速壓縮視頻 瀏覽:432
我的世界如何加入ice伺服器 瀏覽:873
兄弟cnc編程說明書 瀏覽:204
php閃電入門教程學習 瀏覽:152
金岳霖邏輯pdf 瀏覽:938
linuxtomcat線程 瀏覽:77
pboc長度加數據加密 瀏覽:187
英雄聯盟國際服手游怎麼下安卓 瀏覽:297
程序員的思路 瀏覽:234
只能用命令獲得的四種方塊 瀏覽:358
怎麼用命令方塊防止開創造 瀏覽:807
掃描版的pdf 瀏覽:790
編程貓怎樣做3d游戲 瀏覽:207
怎麼查找雲伺服器上的ftp 瀏覽:156
我的世界伺服器如何注冊賬號 瀏覽:935
統計英文字元python 瀏覽:424
linux信息安全 瀏覽:910