python繼承父類函數 python中子類繼承父類

Python面向對象編程之繼承與多態(tài)詳解

Python面向對象編程之繼承與多態(tài)詳解

10年的寧德網站建設經驗,針對設計、前端、開發(fā)、售后、文案、推廣等六對一服務,響應快,48小時及時工作處理。成都全網營銷的優(yōu)勢是能夠根據用戶設備顯示端的尺寸不同,自動調整寧德建站的顯示方式,使網站能夠適用不同顯示終端,在瀏覽器中調整網站的寬度,無論在任何一種瀏覽器上瀏覽網站,都能展現優(yōu)雅布局與設計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯建站從事“寧德網站設計”,“寧德網站推廣”以來,每個客戶項目都認真落實執(zhí)行。

本文實例講述了Python面向對象編程之繼承與多態(tài)。分享給大家供大家參考,具體如下:

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 類的多態(tài)

在說明多態(tài)是什么之前,我們在 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()

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

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

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

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

子類重寫構造函數

子類可以沒有構造函數,表示同父類構造一致;子類也可重寫構造函數;現在,我們需要在子類 Child 中新增兩個屬性變量:mother 和 father,我們可以構造如下(建議子類調用父類的構造方法,參見后續(xù)代碼):

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 , 可繼承父類及父類上層類的屬性及方法,優(yōu)先使用層類近的方法,代碼參考如下:

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

Python繼承父類parent的正確格式為

格式:

class 子類名(父類1,父類2)

類的繼承就是讓子類擁有父類的屬性和方法。

幾個注意:py支持多繼承

子類繼承的父類只能初始化一次,如果父類1和父類2有共同的父類或者祖先類,則類初始化的時候會失敗。

當父類具有相同方法時,會調用最先繼承的父類中的方法,如果要指定父類,則需要重寫此方法,并通過父類名.方法名來調用指定父類方法。

python繼承父類 怎么引用

子類調用父類函數有以下方法:

直接寫類名調用

用 super(type, obj).method(arg)方法調用。

在類定義中調用本類的父類方法,可以直接用super().method(arg)

1

2

3

4

5

6

7

8

9

class A:

def method(self, arg):

pass

class B(A):

def method(self, arg):

# A.method(self,arg) # 1

# super(B, self).method(arg) # 2

super().method(arg) # 3

python中單繼承和多繼承中子類默認繼承父類的哪個構造函數

默認是__init__

【1】python中如果子類有自己的構造函數,不會自動調用父類的構造函數,如果需要用到父類的構造函數,則需要在子類的構造函數中顯式的調用。

【2】如果子類沒有自己的構造函數,則會直接從父類繼承構造函數,這在單繼承(一個子類只從一個父類派生)中沒有任何理解上的問題。

問題:如果是多繼承的情況,一個子類從多個父類派生,而子類又沒有自己的構造函數,則子類默認會繼承哪個父類的構造函數。

【3】子類從多個父類派生,而子類又沒有自己的構造函數時,

(1)按順序繼承,哪個父類在最前面且它又有自己的構造函數,就繼承它的構造函數;

(2)如果最前面第一個父類沒有構造函數,則繼承第2個的構造函數,第2個沒有的話,再往后找,以此類推。

文章名稱:python繼承父類函數 python中子類繼承父類
當前URL:http://m.kartarina.com/article10/dogiigo.html

成都網站建設公司_創(chuàng)新互聯,為您提供網站導航、網站內鏈、企業(yè)建站App設計網站營銷面包屑導航

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯

成都定制網站網頁設計
主站蜘蛛池模板: 岛国av无码免费无禁网站| 国产丰满乱子伦无码专区| 成人免费无码视频在线网站| 无码精品视频一区二区三区| 久久亚洲AV成人出白浆无码国产| 无码人妻H动漫中文字幕| 久久青青草原亚洲av无码| 小13箩利洗澡无码视频网站| yy111111电影院少妇影院无码 | 亚洲热妇无码AV在线播放| av无码久久久久不卡免费网站| 中文字幕AV无码一区二区三区| 东京热一精品无码AV| 久久国产亚洲精品无码| 少妇性饥渴无码A区免费| 国模无码视频一区| 99久久亚洲精品无码毛片| 亚洲精品无码日韩国产不卡?V | 蜜芽亚洲av无码一区二区三区| 无码国产午夜福利片在线观看| 蜜芽亚洲av无码一区二区三区 | 久久无码人妻精品一区二区三区| 99久久亚洲精品无码毛片| 国产在线拍揄自揄拍无码| 无码天堂亚洲国产AV| 中字无码av电影在线观看网站| 久久久久亚洲AV无码专区桃色 | 无码日韩精品一区二区免费暖暖 | 亚洲AV无码乱码在线观看| 亚洲爆乳精品无码一区二区| 最新无码专区视频在线| 无码精品视频一区二区三区| 18禁超污无遮挡无码免费网站| 亚洲AⅤ永久无码精品AA | 亚洲VA中文字幕不卡无码| 亚洲一级特黄无码片| 无码视频免费一区二三区| 国产精品亚洲专区无码牛牛| 亚洲αⅴ无码乱码在线观看性色| 人妻无码一区二区三区免费| 亚洲国产成人精品无码区在线网站|