當前位置:首頁 » 編程語言 » python類的多態

python類的多態

發布時間: 2022-12-18 16:57:06

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根據不同的對象執行相應的內部方法。

❷ 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。

❸ 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的三大特徵

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

java 多態與python多態

不一樣。java的class只能繼承一個parent,需要interface或者需要parent是abstract class;python的class可以繼承多個parent,所以不需要interface,另外,因為python是dynamically typed,所以即使完全不繼承parent,也可以做到多態。

❻ python是面向對象語言嗎

是的!Python由荷蘭數學和計算機科學研究學會的吉多·范羅蘇姆於1990年代初設計,作為一門叫做ABC語言的替代品。Python提供高效的高級數據結構,還能簡單有效地面向對象編程。Python語法和動態類型,以及解釋型語言的本質,使它成為多數平台上寫腳本和快速開發應用的編程語言隨著版本的不斷更新和語言新功能的添加,逐漸被用於獨立的、大型項目的開發。
Python面向對象的特徵:
1、抽象
忽略一個主題中與當前目標無關的東西,專注的注意與當前目標有關的方面。抽象並不打算了解全部問題,而是選擇其中的一部分,暫時不用部分細節,抽象包括兩個方面,一個數據抽象,二是過程抽象。
數據抽象-->表示世界中一類事物的特徵,就是對象的屬性。
過程抽象-->表示世界中一類事物的行為,就是對象的行為。
2、封裝
有些時候我們不希望把對象的屬性公開,就可以把它設為私有,Python並沒有像其他語言對成員的許可權控制系統,如private和protected,默認情況下,Python的所有屬性都是公有的,可以被訪問到,要設成私有,則在前面加雙下劃線。
3、繼承
繼承可以使子類擁有父類的屬性和方法,並且可以重寫這些方法,加強代碼的復用性Python中子類可以有多個父類,但是不建議這樣使用,一般會產生重復調用的問題,Super().方法名,可以調用父類的方法。
4、多態
多態指的是一類事物有多種形態,一個抽象類有多個子類,因而多態的概念依賴於繼承。
指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而採用多種不同的行為方式。

❼ Python對象

眾所周知,Python是一門面向對象的語言,在Python無論是數值、字元串、函數亦或是類型、類,都是對象。
對象是在 堆 上分配的結構,我們定義的所有變數、函數等,都存儲於堆內存,而變數名、函數名則是一個存儲於 棧 中、指向堆中具體結構的引用。

要想深入學習Python,首先需要知道Python對象的定義。

我們通常說的Python都是指CPython,底層由C語言實現,源碼地址: cpython [GitHub]
Python對象的定義位於 Include/object.h ,是一個名為 PyObject 的結構體:

Python中的所有對象都繼承自PyObejct,PyObject包含一個用於垃圾回收的雙向鏈表,一個引用計數變數 ob_refcnt 和 一個類型對象指針 ob_type

從PyObejct的注釋中,我們可以看到這樣一句:每個指向 可變大小Python對象 的指針也可以轉換為 PyVarObject* (可變大小的Python對象會在下文中解釋)。 PyVarObejct 就是在PyObject的基礎上多了一個 ob_size 欄位,用於存儲元素個數:

在PyObject結構中,還有一個類型對象指針 ob_type ,用於表示Python對象是什麼類型,定義Python對象類型的是一個 PyTypeObject 介面體

實際定義是位於 Include/cpython/object.h 的 _typeobject :

在這個類型對象中,不僅包含了對象的類型,還包含了如分配內存大小、對象標准操作等信息,主要分為:

以Python中的 int類型 為例,int類型對象的定義如下:

從PyObject的定義中我們知道,每個對象的 ob_type 都要指向一個具體的類型對象,比如一個數值型對象 100 ,它的ob_type會指向 int類型對象PyLong_Type 。

PyTypeObject結構體第一行是一個PyObject_VAR_HEAD宏,查看宏定義可知PyTypeObject是一個變長對象

也就是說,歸根結底 類型對象也是一個對象 ,也有ob_type屬性,那 PyLong_Type 的 ob_type 是什麼呢?
回到PyLong_Type的定義,第一行 PyVarObject_HEAD_INIT(&PyType_Type, 0) ,查看對應的宏定義

由以上關系可以知道, PyVarObject_HEAD_INIT(&PyType_Type, 0) = { { _PyObject_EXTRA_INIT 1, &PyType_Type } 0} ,將其代入 PyObject_VAR_HEAD ,得到一個變長對象:

這樣看就很明確了,PyLong_Type的類型就是PyType_Typ,同理可知, Python類型對象的類型就是PyType_Type ,而 PyType_Type對象的類型是它本身

從上述內容中,我們知道了對象和對象類型的定義,那麼根據定義,對象可以有以下兩種分類

Python對象定義有 PyObject 和 PyVarObject ,因此,根據對象大小是否可變的區別,Python對象可以劃分為 可變對象(變長對象) 和 不可變對象(定長對象)

原本的對象a大小並沒有改變,只是s引用的對象改變了。這里的對象a、對象b就是定長對象

可以看到,變數l仍然指向對象a,只是對象a的內容發生了改變,數據量變大了。這里的對象a就是變長對象

由於存在以上特性,所以使用這兩種對象還會帶來一種區別:
聲明 s2 = s ,修改s的值: s = 'new string' ,s2的值不會一起改變,因為只是s指向了一個新的對象,s2指向的舊對象的值並沒有發生改變
聲明 l2 = l ,修改l的值: l.append(6) ,此時l2的值會一起改變,因為l和l2指向的是同一個對象,而該對象的內容被l修改了

此外,對於 字元串 對象,Python還有一套內存復用機制,如果兩個字元串變數值相同,那它們將共用同一個對象:

對於 數值型 對象,Python會默認創建0~2 8 以內的整數對象,也就是 0 ~ 256 之間的數值對象是共用的:

按照Python數據類型,對象可分為以下幾類:

Python創建對象有兩種方式,泛型API和和類型相關的API

這類API通常以 PyObject_xxx 的形式命名,可以應用在任意Python對象上,如:

使用 PyObjecg_New 創建一個數值型對象:

這類API通常只能作用於一種類型的對象上,如:

使用 PyLong_FromLong 創建一個數值型對象:

在我們使用Python聲明變數的時候,並不需要為變數指派類型,在給變數賦值的時候,可以賦值任意類型數據,如:

從Python對象的定義我們已經可以知曉造成這個特點的原因了,Python創建對象時,會分配內存進行初始化,然後Python內部通過 PyObject* 變數來維護這個對象,所以在Python內部各函數直接傳遞的都是一種泛型指針 PyObject* ,這個指針所指向的對象類型是不固定的,只能通過所指對象的 ob_type 屬性動態進行判斷,而Python正是通過 ob_type 實現了多態機制

Python在管理維護對象時,通過引用計數來判斷內存中的對象是否需要被銷毀,Python中所有事物都是對象,所有對象都有引用計數 ob_refcnt 。
當一個對象的引用計數減少到0之後,Python將會釋放該對象所佔用的內存和系統資源。
但這並不意味著最終一定會釋放內存空間,因為頻繁申請釋放內存會大大降低Python的執行效率,因此Python中採用了內存對象池的技術,是的對象釋放的空間會還給內存池,而不是直接釋放,後續需要申請空間時,優先從內存對象池中獲取。

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


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

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

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

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

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

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

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

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

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

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


總結:

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

❾ 簡述python語言的概念

Python 是一門優雅而健壯的編程語言,它繼承了傳統編譯語言的強大性和通用性,同時也借鑒了腳本語言和解釋語言的易用性。
Python是由創始人貴鐸·范·羅薩姆(Guido van Rossum)在阿姆斯特丹於1989年聖誕節期間,為了打發聖誕節的無趣,開發的一個新的解釋型腳本語言。之所以選中Python(大蟒蛇的意思)作為該編程語言的名字,是因為他是BBC當時正在熱播的喜劇連續劇「Monty Python」的愛好者。
Python被設計成是 「符合大腦思維習慣」 的,採用極簡主義的設計理念,加以統一規范的交互模式。這使得Python易於學習、理解和記憶。Python 開發者的哲學是 「用一種方法,最好是只有一種方法來做一件事」。
Python是完全面向對象的編程語言,函數、模塊、數字、字元串等內置類型都是對象。它的類支持多態、操作符重載、和多重繼承等高級OOP概念,並且Python特有的簡潔的語法和類型使得OOP十分易於使用。當然OOP只是Python的一個選擇而已,就像C++一樣,Python既支持面向對象編程,也支持面向過程編程的模式。
Python 的優點
1、軟體質量高
2、開發速度快
3、功能強大
4、易於擴展
5、跨平台
Python 的開發方向和應用場景
Web網路開發:
Python提供豐富的模塊支持sockets編程,多線程編程,能方便快速地開發網路服務程序。支持最新的XML技術,支持json語言,資料庫編程,而且Python的ORM框架,使得操作資料庫非常方便。
Python還有優秀的Django、Tornado、Flask等web開發框架,還用眾多的開源插件的支持,足以適用各種不同的web開發需求。
自動化運維:
Python對操作系統服務的內置介面,使其成為編寫可移植的維護操作系統的管理工具和部件的理想工具。Python程序可以搜索文件和目錄樹,可以運行其他程序,可以使用進程和線程並行處理。
網路爬蟲:
在文本處理方面,python提供的re模塊能支持正則表達式,還提供SGML,XML分析模塊,許多程序員利用python進行XML程序的開發。
圖形處理:
有PIL、Tkinter等圖形庫支持,能方便進行圖形處理。 多媒體應用 ,Python的PyOpenGL模塊封裝了「OpenGL應用程序編程介面」,能進行二和三維圖像處理。PyGame模塊可用於編寫游戲軟體
Python版本
python有兩個版本,python 2.X和python 3

❿ 什麼是python多態

讓具有不同功能的函數可以使用相同的函數名,這樣就可以用一個函數名調用不同內容(功能)的函數。

Python中多態的特點
1、只關心對象的實例方法是否同名,不關心對象所屬的類型;
2、對象所屬的類之間,繼承關系可有可無;
3、多態的好處可以增加代碼的外部調用靈活度,讓代碼更加通用,兼容性比較強;
4、多態是調用方法的技巧,不會影響到類的內部設計。

熱點內容
新年解壓糖 發布:2024-05-20 09:50:55 瀏覽:54
以太坊價值在哪裡存儲 發布:2024-05-20 09:46:34 瀏覽:641
cgipython配置 發布:2024-05-20 09:29:06 瀏覽:865
在我的世界伺服器中隱身 發布:2024-05-20 09:07:46 瀏覽:972
加西貝拉壓縮機好嗎 發布:2024-05-20 08:58:56 瀏覽:757
eve腳本航 發布:2024-05-20 08:56:59 瀏覽:591
取票人的密碼是什麼 發布:2024-05-20 08:21:43 瀏覽:963
天貓帳號密碼應輸入什麼 發布:2024-05-20 08:16:26 瀏覽:272
plsql異常處理 發布:2024-05-20 07:54:47 瀏覽:542
dreamweaver上傳網頁 發布:2024-05-20 07:51:24 瀏覽:462