欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

python構(gòu)造函數(shù)重寫,構(gòu)造函數(shù)可以重寫

Python面向?qū)ο缶幊讨^承與多態(tài)詳解

Python面向?qū)ο缶幊讨^承與多態(tài)詳解

創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供翠屏網(wǎng)站建設(shè)、翠屏做網(wǎng)站、翠屏網(wǎng)站設(shè)計(jì)、翠屏網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、翠屏企業(yè)網(wǎng)站模板建站服務(wù),十多年翠屏做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

本文實(shí)例講述了Python面向?qū)ο缶幊讨^承與多態(tài)。分享給大家供大家參考,具體如下:

Python 類的繼承

在OOP(Object Oriented Programming)程序設(shè)計(jì)中,當(dāng)我們定義一個(gè)class的時(shí)候,可以從某個(gè)現(xiàn)有的class 繼承,新的class稱為子類(Subclass),而被繼承的class稱為基類、父類或超類(Base class、Super class)。

我們先來(lái)定義一個(gè)class Person,表示人,定義屬性變量 name 及 sex (姓名和性別);

定義一個(gè)方法print_title():當(dāng)sex是male時(shí),print man;當(dāng)sex 是female時(shí),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) 來(lái)表示繼承;

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

實(shí)例化Child的時(shí)候,子類繼承了父類的構(gòu)造函數(shù),就需要提供父類Person要求的兩個(gè)屬性變量 name 及 sex:

在繼承關(guān)系中,如果一個(gè)實(shí)例的數(shù)據(jù)類型是某個(gè)子類,那它也可以被看做是父類(May 既是 Child 又是 Person)。但是,反過(guò)來(lái)就不行(Peter 僅是 Person,而不是Child)。

繼承還可以一級(jí)一級(jí)地繼承下來(lái),就好比從爺爺?shù)桨职?、再到兒子這樣的關(guān)系。而任何類,最終都可以追溯到根類object,這些繼承關(guān)系看上去就像一顆倒著的樹(shù)。比如如下的繼承樹(shù):

isinstance() 及 issubclass()

Python 與其他語(yǔ)言不同點(diǎn)在于,當(dāng)我們定義一個(gè) class 的時(shí)候,我們實(shí)際上就定義了一種數(shù)據(jù)類型。我們定義的數(shù)據(jù)類型和Python自帶的數(shù)據(jù)類型,比如str、list、dict沒(méi)什么兩樣。

Python 有兩個(gè)判斷繼承的函數(shù):isinstance() 用于檢查實(shí)例類型;issubclass() 用于檢查類繼承。參見(jiàn)下方示例:

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)

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

當(dāng)子類和父類都存在相同的 print_title()方法時(shí),子類的 print_title() 覆蓋了父類的 print_title(),在代碼運(yùn)行時(shí),會(huì)調(diào)用子類的 print_title()

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

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

對(duì)擴(kuò)展開(kāi)放(Open for extension):允許子類重寫方法函數(shù)

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

子類重寫構(gòu)造函數(shù)

子類可以沒(méi)有構(gòu)造函數(shù),表示同父類構(gòu)造一致;子類也可重寫構(gòu)造函數(shù);現(xiàn)在,我們需要在子類 Child 中新增兩個(gè)屬性變量:mother 和 father,我們可以構(gòu)造如下(建議子類調(diào)用父類的構(gòu)造方法,參見(jiàn)后續(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)

若父類構(gòu)造函數(shù)包含很多屬性,子類僅需新增1、2個(gè),會(huì)有不少冗余的代碼,這邊,子類可對(duì)父類的構(gòu)造方法進(jìn)行調(diào)用,參考如下:

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) # 子類對(duì)父類的構(gòu)造方法的調(diào)用

self.mother = mother

self.father = father

May = Child("May","female","April","June")

print(May.name,May.sex,May.mother,May.father)

多重繼承

多重繼承的概念應(yīng)該比較好理解,比如現(xiàn)在需要新建一個(gè)類 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)先使用上層類的方法

有A extends B,A沒(méi)有構(gòu)造函數(shù),B有無(wú)參構(gòu)造函數(shù),當(dāng)new A()時(shí),會(huì)調(diào)用父類函數(shù)嗎?

先小小糾正一下,java里面一般不叫函數(shù),叫方法,這是Java的一個(gè)小習(xí)慣。

你這個(gè)問(wèn)題原因很簡(jiǎn)單。

首先,任何類都有構(gòu)造方法,難怕是你不寫,也會(huì)默認(rèn)你有一個(gè)有無(wú)參構(gòu)造方法。,所以你的A里面就會(huì)有一個(gè)叫A()的構(gòu)造方法。

當(dāng)你new A()時(shí),默認(rèn)你有一個(gè)有無(wú)參構(gòu)造方法A()的方法里的第一句,會(huì)自動(dòng)加上一個(gè)super();的方法,這句就是調(diào)用父類構(gòu)造方法的意思,這是java規(guī)定的規(guī)則。

你可以嘗試一下,在A里寫一個(gè)構(gòu)造方法:

A(){

super();? ?//這個(gè)一定要放在第一句

System.out..XX;

}

這與你不寫super()這句效果是一樣的,因如果沒(méi)寫,java會(huì)默認(rèn)在第一句加上super。

1.構(gòu)造函數(shù)的命名必須和類名完全相同。在java中普通函數(shù)可以和構(gòu)造函數(shù)同名,但是必須帶有返回值;

2.構(gòu)造函數(shù)的功能主要用于在類的對(duì)象創(chuàng)建時(shí)定義初始化的狀態(tài)。它沒(méi)有返回值,也不能用void來(lái)修飾。這就保證了它不僅什么也不用自動(dòng)返回,而且根本不能有任何選擇。而其他方法都有返回值,即使是void返回值。盡管方法體本身不會(huì)自動(dòng)返回什么,但仍然可以讓它返回一些東西,而這些東西可能是不安全的;

3.構(gòu)造函數(shù)不能被直接調(diào)用,必須通過(guò)new運(yùn)算符在創(chuàng)建對(duì)象時(shí)才會(huì)自動(dòng)調(diào)用;而一般的方法是在程序執(zhí)行到它的時(shí)候被調(diào)用的;

4.當(dāng)定義一個(gè)類的時(shí)候,通常情況下都會(huì)顯示該類的構(gòu)造函數(shù),并在函數(shù)中指定初始化的工作也可省略,不過(guò)Java編譯器會(huì)提供一個(gè)默認(rèn)的構(gòu)造函數(shù).此默認(rèn)構(gòu)造函數(shù)是不帶參數(shù)的。而一般的方法不存在這一特點(diǎn);

5.構(gòu)造函數(shù)有回滾的效果,構(gòu)造函數(shù)拋出異常時(shí),構(gòu)造的是一個(gè)不完整對(duì)象,會(huì)回滾,將此不完整對(duì)象的成員釋放(c++)

6.當(dāng)一個(gè)類只定義了私有的構(gòu)造函數(shù),將無(wú)法通過(guò)new關(guān)鍵字來(lái)創(chuàng)建其對(duì)象,當(dāng)一個(gè)類沒(méi)有定義任何構(gòu)造函數(shù),C#編譯器會(huì)為其自動(dòng)生成一個(gè)默認(rèn)的無(wú)參的構(gòu)造函數(shù)。[1]

7.在Python中構(gòu)造函數(shù)必須通過(guò)重寫__init__方法實(shí)現(xiàn)

構(gòu)造函數(shù)的有參和無(wú)參的區(qū)別,構(gòu)造函數(shù)的參數(shù)是派什么用場(chǎng)的?

區(qū)別:

1.如果在創(chuàng)建對(duì)象時(shí)不寫參數(shù),調(diào)用的就是無(wú)參的構(gòu)造方法??墒侨绻銓懙挠杏袇⒌臉?gòu)造方法,而沒(méi)有無(wú)參的構(gòu)造方法,那么再“創(chuàng)建對(duì)象時(shí)不寫參數(shù)”就會(huì)報(bào)錯(cuò),程序會(huì)認(rèn)為你知道該怎么做。

如果構(gòu)造方法有參數(shù),在創(chuàng)建對(duì)象時(shí)傳入了參數(shù),那么就會(huì)調(diào)用此方法,這一點(diǎn)和重載類似。

2.沒(méi)有參數(shù)的構(gòu)造函數(shù)就是默認(rèn)構(gòu)造函數(shù)。

有參數(shù)的構(gòu)造函數(shù)可用傳遞的參數(shù)給類中的屬性賦初始值或執(zhí)行初始化操作例如訂閱事件等。

構(gòu)造函數(shù)是在創(chuàng)建給定類型的對(duì)象時(shí)執(zhí)行的類方法。構(gòu)造函數(shù)具有與類相同的名稱,它通常初始化新對(duì)象的數(shù)據(jù)成員。

任何時(shí)候,只要?jiǎng)?chuàng)建類或結(jié)構(gòu),就會(huì)調(diào)用它的構(gòu)造函數(shù)。類或結(jié)構(gòu)可能有多個(gè)接受不同參數(shù)的構(gòu)造函數(shù)。構(gòu)造函數(shù)使得程序員可設(shè)置默認(rèn)值、限制實(shí)例化以及編寫靈活且便于閱讀的代碼。

如果沒(méi)有為對(duì)象提供構(gòu)造函數(shù),則默認(rèn)情況下 C# 將創(chuàng)建一個(gè)構(gòu)造函數(shù),該構(gòu)造函數(shù)實(shí)例化對(duì)象,并將所有成員變量設(shè)置系統(tǒng)指定的默認(rèn)值。靜態(tài)類和結(jié)構(gòu)也可以有構(gòu)造函數(shù)。

擴(kuò)展資料

主要特點(diǎn)

1.構(gòu)造函數(shù)的命名必須和類名完全相同。在java中普通函數(shù)可以和構(gòu)造函數(shù)同名,但是必須帶有返回值;

2.構(gòu)造函數(shù)的功能主要用于在類的對(duì)象創(chuàng)建時(shí)定義初始化的狀態(tài)。它沒(méi)有返回值,也不能用void來(lái)修飾。這就保證了它不僅什么也不用自動(dòng)返回,而且根本不能有任何選擇。而其他方法都有返回值,即使是void返回值。盡管方法體本身不會(huì)自動(dòng)返回什么,但仍然可以讓它返回一些東西,而這些東西可能是不安全的;

3.構(gòu)造函數(shù)不能被直接調(diào)用,必須通過(guò)new運(yùn)算符在創(chuàng)建對(duì)象時(shí)才會(huì)自動(dòng)調(diào)用;而一般的方法是在程序執(zhí)行到它的時(shí)候被調(diào)用的;

4.當(dāng)定義一個(gè)類的時(shí)候,通常情況下都會(huì)顯示該類的構(gòu)造函數(shù),并在函數(shù)中指定初始化的工作也可省略,不過(guò)Java編譯器會(huì)提供一個(gè)默認(rèn)的構(gòu)造函數(shù).此默認(rèn)構(gòu)造函數(shù)是不帶參數(shù)的。而一般的方法不存在這一特點(diǎn);

5.構(gòu)造函數(shù)有回滾的效果,構(gòu)造函數(shù)拋出異常時(shí),構(gòu)造的是一個(gè)不完整對(duì)象,會(huì)回滾,將此不完整對(duì)象的成員釋放(c++)

6.當(dāng)一個(gè)類只定義了私有的構(gòu)造函數(shù),將無(wú)法通過(guò)new關(guān)鍵字來(lái)創(chuàng)建其對(duì)象,當(dāng)一個(gè)類沒(méi)有定義任何構(gòu)造函數(shù),C#編譯器會(huì)為其自動(dòng)生成一個(gè)默認(rèn)的無(wú)參的構(gòu)造函數(shù)。

參考資料:百度百科——構(gòu)造函數(shù)

photon.socketserver.peerbase未定義構(gòu)造函數(shù)怎么解決

構(gòu)造函數(shù) ,是一種特殊的方法。主要用來(lái)在創(chuàng)建對(duì)象時(shí)初始化對(duì)象, 即為對(duì)象成員變量賦初始值,總與new運(yùn)算符一起使用在創(chuàng)建對(duì)象的語(yǔ)句中。特別的一個(gè)類可以有多個(gè)構(gòu)造函數(shù) ,可根據(jù)其參數(shù)個(gè)數(shù)的不同或參數(shù)類型的不同來(lái)區(qū)分它們 即構(gòu)造函數(shù)的重載。

1.構(gòu)造函數(shù)的命名必須和類名完全相同。在java中普通函數(shù)可以和構(gòu)造函數(shù)同名,但是必須帶有返回值;

2.構(gòu)造函數(shù)的功能主要用于在類的對(duì)象創(chuàng)建時(shí)定義初始化的狀態(tài)。它沒(méi)有返回值,也不能用void來(lái)修飾。這就保證了它不僅什么也不用自動(dòng)返回,而且根本不能有任何選擇。而其他方法都有返回值,即使是void返回值。盡管方法體本身不會(huì)自動(dòng)返回什么,但仍然可以讓它返回一些東西,而這些東西可能是不安全的;

3.構(gòu)造函數(shù)不能被直接調(diào)用,必須通過(guò)new運(yùn)算符在創(chuàng)建對(duì)象時(shí)才會(huì)自動(dòng)調(diào)用;而一般的方法是在程序執(zhí)行到它的時(shí)候被調(diào)用的;

4.當(dāng)定義一個(gè)類的時(shí)候,通常情況下都會(huì)顯示該類的構(gòu)造函數(shù),并在函數(shù)中指定初始化的工作也可省略,不過(guò)Java編譯器會(huì)提供一個(gè)默認(rèn)的構(gòu)造函數(shù).此默認(rèn)構(gòu)造函數(shù)是不帶參數(shù)的。而一般的方法不存在這一特點(diǎn);

5.構(gòu)造函數(shù)有回滾的效果,構(gòu)造函數(shù)拋出異常時(shí),構(gòu)造的是一個(gè)不完整對(duì)象,會(huì)回滾,將此不完整對(duì)象的成員釋放(c++)

6.當(dāng)一個(gè)類只定義了私有的構(gòu)造函數(shù),將無(wú)法通過(guò)new關(guān)鍵字來(lái)創(chuàng)建其對(duì)象,當(dāng)一個(gè)類沒(méi)有定義任何構(gòu)造函數(shù),C#編譯器會(huì)為其自動(dòng)生成一個(gè)默認(rèn)的無(wú)參的構(gòu)造函數(shù)。[1]

7.在Python中構(gòu)造函數(shù)必須通過(guò)重寫__init__方法實(shí)現(xiàn)

C++語(yǔ)言為類提供的構(gòu)造函數(shù)可自動(dòng)完成對(duì)象的初始化任務(wù),全局對(duì)象和靜態(tài)對(duì)象的構(gòu)造函數(shù)在main()函數(shù)執(zhí)行之前就被調(diào)用,局部靜態(tài)對(duì)象的構(gòu)造函數(shù)是當(dāng)程序第一次執(zhí)行到相應(yīng)語(yǔ)句時(shí)才被調(diào)用。然而給出一個(gè)外部對(duì)象的引用性聲明時(shí),并不調(diào)用相應(yīng)的構(gòu)造函數(shù),因?yàn)檫@個(gè)外部對(duì)象只是引用在其他地方聲明的對(duì)象,并沒(méi)有真正地創(chuàng)建一個(gè)對(duì)象。

本文標(biāo)題:python構(gòu)造函數(shù)重寫,構(gòu)造函數(shù)可以重寫
當(dāng)前網(wǎng)址:http://aaarwkj.com/article6/dsichig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、電子商務(wù)微信公眾號(hào)、自適應(yīng)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)

廣告

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

成都網(wǎng)頁(yè)設(shè)計(jì)公司
国产又粗又长又猛又爽视频| 欧美日韩免费爱爱视频| 亚洲av乱码久久精品蜜桃| 色综合一区二区日本韩国亚洲| 年轻的少妇一区二区三区| 日韩欧美亚洲国产每日更新| 99久久精彩免费视频| 欧美亚洲国产精品综合在线| 蜜桃精品视频在线播放| 午夜在线成人免费观看| 国产在线观看国产精品| 亚洲国产日韩中文字幕| 成人免费大片在线观看视频| 亚洲日本韩国福利久久| 亚洲国产精品中文字幕一区久久| 每日更新中文字幕粉嫩av| 一区二区三区人妻av| 国产一区二区三区在线看片| 本色啪啪人妻夜嗨嗨av| 亚洲一区二区天堂av| 男人的天堂av免费看看| 午夜视频在线观看91| 国产熟女一区二区三区正在| 91出品国产福利在线| 国产三级网站在线观看播放| 国内自拍韩国资源在线| 最新91熟女九色地址| 国产在线拍揄自揄视频不卡99| 中文字幕人妻系列东京热| 中文字幕人妻熟女人妻| 欧美日韩国产激情在线观看| 伊人性伊人情亚洲综合| 亚洲精品成av人在线观看| 四虎国产精品久久久久久网址| 亚洲少妇熟女一区二区三区| 日本 一区二区在线| 日本乱一区二区三区在线| 亚洲国产一区二区三区三州| 欧美精品一区影片在线观看| 欧美日韩激情中文字幕| 在线亚洲av不卡一区二区三区|