Python程序設計教程 課件 第7章 面向?qū)ο蟪绦蛟O計_第1頁
Python程序設計教程 課件 第7章 面向?qū)ο蟪绦蛟O計_第2頁
Python程序設計教程 課件 第7章 面向?qū)ο蟪绦蛟O計_第3頁
Python程序設計教程 課件 第7章 面向?qū)ο蟪绦蛟O計_第4頁
Python程序設計教程 課件 第7章 面向?qū)ο蟪绦蛟O計_第5頁
已閱讀5頁,還剩68頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

Python程序設計實用教程xxx第7章面向?qū)ο蟪绦蛟O計本章要點面向?qū)ο蟮母拍铑惻c對象屬性與方法繼承與多態(tài)訪問限制7.1面向?qū)ο蟾攀?/p>

面向?qū)ο笫且环N程序設計范型,同時也是一種程序開發(fā)的方法。一切事物皆對象,對象是類的具體化實現(xiàn),類是對象的抽象。將對象作為程序的基本單元,將程序和數(shù)據(jù)封裝其中,以提高軟件的重用性、靈活性和擴展性。7.1.1面向過程和面向?qū)ο?.面向過程

面向過程是以過程為中心的編程思想。采用結(jié)構(gòu)化設計的方法求解問題,其基本策略是從功能的角度審視問題域。它將應用程序看成實現(xiàn)某些特定任務的功能模塊,其中子過程是實現(xiàn)某項具體操作的底層功能模塊。在每個功能模塊中,用數(shù)據(jù)結(jié)構(gòu)描述待處理數(shù)據(jù)的組織形式,用算法描述具體的操作過程。面向過程的優(yōu)缺點:

優(yōu)點:性能比面向?qū)ο蟾?,因為類調(diào)用時需要實例化,比較消耗資源。比如Linux/Unix等一般采用面向過程開發(fā),性能是最重要的因素。很多驅(qū)動,單片機開發(fā),涉及到硬件圖形渲染,算法封裝等,都會采用面向過程。缺點:(1).復用性較低,因為面向過程是逐步進行功能的實現(xiàn)。(2).代碼維護困難,在面向過程編程中沒有面向?qū)ο蟮姆庋b方法,如果出問題得全局進行逐步代碼分析。2.面向?qū)ο?/p>

面向?qū)ο笫且环N對現(xiàn)實世界理解和抽象的方法,面向?qū)ο蟪绦蛟O計是盡可能地模擬人類的思維進行軟件開發(fā)。這樣的方式能夠讓開發(fā)的軟件更加符合人類的認知,人們使用起來也能夠更加順手,通過應用軟件能夠切實地解決現(xiàn)實生活中的問題。

面向?qū)ο缶幊痰闹饕枷胧前褬?gòu)成問題的各個事務分解成各個對象,建立對象的目的不是為了完成一個步驟,而是為了描敘一個事物在整個解決問題的步驟中的行為。

面向?qū)ο蟪绦蛟O計中的概念主要包括:對象、類、數(shù)據(jù)抽象、繼承、動態(tài)綁定、數(shù)據(jù)封裝、多態(tài)性、消息傳遞。項目程序代碼是以類為單位,方法從屬于類。通過這些概念面向?qū)ο蟮乃枷氲玫搅司唧w的體現(xiàn)。

面向?qū)ο蟮乃季S更符合人的認識和思考問題的方式,面向?qū)ο蟮谋硎靖咏陀^世界,表示方案更加自然,易于理解。

面向?qū)ο蠹夹g具有良好的模塊性、可維護性、可擴充性和可重用性等特點。

面向?qū)ο髢?yōu)缺點:(優(yōu)點)(1).易維護:代碼可讀性好,面向?qū)ο蟪绦蛟O計比較容易理解業(yè)務邏輯。(2).可復用:實例化一個類成為一個對象,實例化,可繼承,可封裝。(3).易擴展:可以自己重寫實例化這個方法。允許一個對象的多個實例同時存,彼此之間不會相互干擾。(4).低耦合:由于面向?qū)ο笥蟹庋b、繼承、多態(tài)性的特性,可以設計出低耦合的系統(tǒng),使系統(tǒng)更加靈活、更加易于維護。(5).安全性較高:在復用時直接調(diào)用封裝好的方法即可,可以避免不必要的更改引起的錯誤。缺點:其程序處理的效率比較低,代碼容易冗余。

面向過程和面向?qū)ο蠖际墙鉀Q實際問題的一種思維方式,二者相輔相成,并不是對立的。解決復雜問題,通過面向?qū)ο蠓绞奖阌趶暮暧^上把握事物之間復雜的關系、方便分析整個系統(tǒng)。具體到微觀操作,仍然使用面向過程方式來處理。7.1.2面向?qū)ο蟮幕靖拍?/p>

類:類是具有相同特性(數(shù)據(jù)元素)和行為(功能)的對象的抽象。

對象的抽象是類,類的具體化就是對象,類的實例是對象。類具有屬性,它是對象的狀態(tài)的抽象,用數(shù)據(jù)結(jié)構(gòu)來描述類的屬性。類具有操作,它是對象的行為的抽象,用方法來描述。類實際上就是一種數(shù)據(jù)類型,類映射的每一個對象都具有這些數(shù)據(jù)和操作方法。

對象:對象是指具體的某一個事物,即在現(xiàn)實生活中能夠看得見摸得著的事物。在面向?qū)ο蟪绦蛟O計中,對象所指的是系統(tǒng)中的某一個成分。

對象包含兩個含義,其中一個是數(shù)據(jù),另外一個是動作。對象則是數(shù)據(jù)和動作的結(jié)合體。

方法:方法是指對象能夠進行的操作,方法同時還有另外一個名稱,叫做函數(shù)。方法是類中定義的函數(shù),其具體的作用就是對對象進行描述操作。繼承:繼承簡單地說就是一種層次模型,這種層次模型能夠被重用。層次結(jié)構(gòu)的上層具有通用性,下層結(jié)構(gòu)則具有特殊性。類的繼承具有層次性和結(jié)構(gòu)性,在繼承的過程中類則可以從最頂層的部分繼承一些方法和變量。

封裝:封裝是將數(shù)據(jù)和代碼捆綁到一起,對象的某些數(shù)據(jù)和代碼可以是私有的,不能被外界訪問,以此實現(xiàn)對數(shù)據(jù)和代碼不同級別的訪問權(quán)限。防止了程序相互依賴性而帶來的變動影響,面向?qū)ο蟮姆庋b使得處理邏輯更為清晰、更為有力。

有效實現(xiàn)了兩個目標:對數(shù)據(jù)和行為的包裝和信息隱藏。

多態(tài):多態(tài)是指不同事物具有不同表現(xiàn)形式的能力。多態(tài)機制使具有不同內(nèi)部結(jié)構(gòu)的對象可以共享相同的外部接口,通過這種方式減少代碼的復雜度。一個接口,多種方式。

動態(tài)綁定:動態(tài)綁定指的是將一個過程調(diào)用與相應代碼鏈接起來的行為。動態(tài)綁定是指與給定的過程調(diào)用相關聯(lián)的代碼只有在運行期才可知的一種綁定,它是多態(tài)實現(xiàn)的具體形式。

消息傳遞:對象之間需要相互溝通,溝通的途徑就是對象之間收發(fā)信息。消息內(nèi)容包括接收消息的對象的標識,需要調(diào)用的函數(shù)的標識,以及必要的信息。消息傳遞的概念使得對現(xiàn)實世界的描述更容易。

面向?qū)ο蟮姆椒ň褪抢贸橄?、封裝等機制,借助于對象、類、繼承、消息傳遞等概念進行軟件系統(tǒng)構(gòu)造的軟件開發(fā)方法。7.2類與對象

1類的定義

創(chuàng)建一個對象,需要先定義一個類。類是由3部分組成。

(1)類名:類的名稱,它的首字母必須是大寫,如Person。

(2)屬性:用于描述事物的特征,比如,人有姓名、年齡等特征。

(3)方法:用于描述事物的行為,比如,人具有說話、微笑等行為。

在Python中,使用class關鍵字來聲明一個類,其基本語法格式如下:class類名:

類的屬性

類的方法【例7.1】類的定義示例程序。classCat:#屬性def__init__(self):self.color="white"self.size=35self.weiht=500#方法

defeat(self):print("----吃魚----")

在上述示例中,使用class定義了一個名稱為Cat的類,類中有一個eat方法。從示例可以看出,方法跟函數(shù)的格式是一樣的,主要的區(qū)別在于方法必須顯式地聲明一個self參數(shù),而且位于參數(shù)列表的開頭。self代表類的對象本身,可以用來引用對象的屬性和方法。

類屬性指的就是包含在類中的變量。而類方法指的是包含類中的函數(shù)。換句話說,類屬性和類方法其實分別是包含類中的變量和函數(shù)的別稱。

需要注意的是,同屬一個類的所有類屬性和類方法,要保持統(tǒng)一的縮進格式,通常統(tǒng)一縮進4個空格?!纠?.2】定義一個Person類。classPerson:'''這是一個學習而定義的類'''#下面定義了一個類屬性

name='張三'#下面定義了一個say方法defsay(self,content):print(content)

在各個類方法之外定義的變量稱為類屬性或類變量(如name屬性),而在類方法中定義的屬性稱為實例屬性(或?qū)嵗兞浚erson類中還包含一個say()類方法。7.2.2對象的創(chuàng)建與使用

在Python中,類是一種用戶定義的數(shù)據(jù)類型,用于創(chuàng)建對象。一個類可以包含屬性和方法。

【例7.3】一個簡單的類定義及實例化對象示例。classPerson:def__init__(self,name,age):

=name

self.age=agedefsay_hello(self):

print(“hello,mynameis”++“andIam”+str(self.age))Person類有兩個屬性:name和age,以及一個名為say_hello()的方法。init()方法是構(gòu)成函數(shù),用于對象的初始化。say_hello()方法用于打印對象的屬性值。可以使用類實例化一個Person對象:

p=Person(“張三”,30)p.say_hello()

在上面程序中,將"張三"和30傳遞給Person類的構(gòu)造方法,這會創(chuàng)建一個名為p的對象,它的name屬性被設置為"張三",age屬性被設置為30。然后調(diào)用p對象的say_hello()方法,這會打印"Hello,mynameis張三andIam30."。

在Python中,對象是類的實例。當使用類創(chuàng)建對象時,實際上創(chuàng)建了類的一個實例,該實例包含類的屬性和方法。在上面的示例中,創(chuàng)建了一個Person類對象p。此時,p變量包含了Person類的屬性和方法。類的屬性可以通過對象訪問,例如:print()#輸出“張三”print(p.age)#輸出30

可以創(chuàng)建多個對象,并將它們賦值給不同的變量。每個對象都是類的一個獨立實例,它們具有相同的屬性和方法,但屬性的值可以不同。p1=Person("Bob",25)p2=Person("Charlie",40)

p1.say_hello()#輸出:"Hello,mynameisBobandIam25."p2.say_hello()#輸出:"Hello,mynameisCharlieandIam40."

print()#輸出:"Bob"print()#輸出:"Charlie"【例7.4】對象屬性和方法使用示例。classCar:def__init__(self,make,model,year):self.make=makeself.model=modelself.year=yearself.odometer_reading=0

defget_descriptive_name(self):long_name=str(self.year)+''+self.make+''+self.modelreturnlong_name.title()

defread_odometer(self):print("Thiscarhas"+str(self.odometer_reading)+"milesonit.")

defupdate_odometer(self,mileage):ifmileage>=self.odometer_reading:self.odometer_reading=mileageelse:print("Youcan'trollbackanodometer!")

defincrement_odometer(self,miles):self.odometer_reading+=milesmy_car=Car('奧迪','A6',2023)print(my_car.get_descriptive_name())#輸出:"2023AudiA4"my_car.update_odometer(120)my_car.read_odometer()#輸出:"Thiscarhas120milesonit."

my_car.increment_odometer(50)my_car.read_odometer()#輸出:"Thiscarhas170milesonit."

運行結(jié)果:2023奧迪A6Thiscarhas120milesonit.Thiscarhas170milesonit.

在上面程序中,定義了一個Car類,它有一些屬性和方法。

創(chuàng)建了一個名為my_car的對象,并將其賦值給變量my_car。當調(diào)用my_car對象的get_descriptive_name()方法,這會打印一個描述汽車的字符串。調(diào)用my_car對象的update_odometer()方法,將其里程數(shù)設置為120。

調(diào)用my_car對象的read_odometer()方法,這會打印汽車的里程數(shù)。

調(diào)用my_car對象的increment_odometer()方法,這會將汽車的里程數(shù)增加50英里,然后再次調(diào)用read_odometer()方法,這會打印更新后的里程數(shù)。7.2.3self參數(shù)和__init__()函1.selfPython編寫類的時候,每個函數(shù)參數(shù)第一個參數(shù)都是self,self只有在類的方法中才會有,Python獨立的函數(shù)是不必帶有self的。

下面代碼中,第1行,定義了一個類MyClass,第2行定義了一個方法do_stuff(self,some_arg),self是方法中的第一個參數(shù)。

1classMyClass:2defdo_stuff(self,some_arg):3print(some_arg)

4my=MyClass()5my.do_stuff("whatever")6my1=MyClass()7my1.do_stuff("hello")第4用類MyClass()實例化一個對象my。第5行通過my對象運行其方法do_stuff(),并傳入實際參"whatever"。程序運行時,第2行中的self將被對象my替代,"whatever"傳給形參數(shù)some_arg。第6行用類MyClass()實例化另一個對象my1。第7行通過my1對象運行其方法do_stuff(),并傳入實際參"hello"。程序運行時,第2行中的self將被對象my1替代,"hello"傳給形參數(shù)some_arg。

實際上不必一定稱為self,它只是一個約定。也可以寫成其他字符串,但通常寫成self,用于替代傳入的實例對象名稱,類實例化后,self即代表著實例(對象)本身。當不同的對象使用類時,其參數(shù)保持不同。所以,self當做實例(對象)的身份證,每個實例都是獨一無二的,它可以調(diào)用類的方法、屬性。2.__init__()函數(shù)__init__()是類中的一種函數(shù),叫做構(gòu)造函數(shù)。每次創(chuàng)建類的實例對象時,_init__()函數(shù)就會自動被調(diào)用。

是一個初始化的方法。在系統(tǒng)申請內(nèi)存空間時,__init__()為對象的每個變量申請內(nèi)存空間并賦初值。【例7.5】__init__()的基本作用,為對象的每個變量申請內(nèi)存空間并賦初值。classStudent:

def__init__(self,name,gender):=nameself.gender=genders1=Student("李明","男")s2=Student("王靜","女")

程序創(chuàng)建一個Student類,構(gòu)造函數(shù)__init__(self,name,gender)有2個參數(shù)name和gender。

實例化對象s1=Student("李明","男")時,將"李明","男"初始化值賦給s1對象的name和gender。

當實例化另一個對象s2=Student("王靜","女")時,將"王靜","女"初始化值賦給s2對象的name和gender。7.2.4__del__()方法

當刪除一個對象時,Python解釋器也會默認調(diào)用一個方法,這個方法為__del__()方法。

Python中的__del__()方法主要用于在對象被銷毀時執(zhí)行特定的清理操作,一般用于釋放資源或撤銷在對象構(gòu)造時所創(chuàng)建的對象,以防止內(nèi)存泄漏。

【例7.6】__del__()方法的使用示例。classMyClass:def__init__(self,name):=nameprint('{}對象已經(jīng)創(chuàng)建'.format())

def__del__(self):print('{}對象已經(jīng)被銷毀'.format())obj=MyClass('李明')

delobj

運行結(jié)果:

李明對象已經(jīng)創(chuàng)建

李明對象已經(jīng)被銷毀7.3屬性與方法1屬性

在Python中的屬性分為類屬性和對象(實例)屬性,其含義為:(1).類屬性就是屬于類所有,可以直接用類名.屬性名直接調(diào)用,類的屬性在內(nèi)存中只有一份。

(2).實例屬性屬于類的對象所有,可以用對象名.屬性名的形式進行調(diào)用,但是不能用類名.屬性名進行調(diào)用。因為實例屬性只有在實例創(chuàng)建時,才會初始化創(chuàng)建。實例屬性就是在__init__()方法中初始化的屬性?!纠?.7】類屬性和實例的屬性的調(diào)用示例程序。classPerson:

country="china"#類屬性

def__init__(self,name,age):

sex="男"#這不是實例屬性,是變量,用對象名.sex調(diào)不出來。

=name#實例屬性

self.age=age

print(Person.country)運行結(jié)果:chinaprint(Person.age)

運行結(jié)果:

出錯,AttributeError:typeobject'Person'hasnoattribute'age'#創(chuàng)建對象p1=Person("tom",12)print(p1.country,p1.age,,p1.sex,p1)運行結(jié)果:china12tom<__main__.Personobjectat0x0000000002CA37C0>

程序中country是類屬性,用Person.country調(diào)用,也可以對象.屬性調(diào)用p1.country。self.age和是對象屬性,只能用對象名.屬性調(diào)用p1.age,。用類名.屬性調(diào)用會出錯,Person.age,顯示typeobject'Person'hasnoattribute'age'?!纠?.8】修改類屬性和實例屬性,類屬性只能通過類名.屬性才可以修改。classPerson:country="china"#類屬性def__init__(self,name,age):sex="男"#這不是實例屬性,是變量,用對象名.sex調(diào)不出來。=name#實例屬性self.age=age#創(chuàng)建對象p1=Person("tom",12)p1.country="america"print(p1.country)#通過實例去修改屬性,實例的屬性修改了:americaprint(Person.country)#但是類的屬性還是沒有修改:chinaPerson.country="japan"#只有用類名.屬性名才能修改類的屬性值。p2=Person("jack",11)print("p1.country:",p1.country)print("p2.country",p2.country)print("Person.country",Person.country)

顯示結(jié)果p1.country:americap2.countryjapanPerson.countryjapanp1.country="america"語句修改了p1對象的country屬性,但類的屬性沒有修改。只有通過Person.country="japan"才能修改類的屬性。7.3.2方法

Python類中的方法有3種類型:實例方法、靜態(tài)方法、類方法。實例方法僅能通過實例調(diào)用。靜態(tài)方法和類方法可以用實例調(diào)用,也可以直接通過類名調(diào)用。

1.實例方法

實例方法就是定義在類中的函數(shù),此種類型的方法只能夠被實例對象調(diào)用。

實例方法最大的特點就是,它最少也要包含一個self參數(shù),用于綁定調(diào)用此方法的實例對象,實例方法通常會用類對象直接調(diào)用。【例7.10】實例方法使用示例程序。classPerson:#類構(gòu)造方法,也屬于實例方法def__init__(self,name,age):

=nameself.age=age#下面定義了一個say實例方法defsay(self):print("正在調(diào)用say()實例方法")p=Person("李明",23)p.say()2.靜態(tài)方法

靜態(tài)方法,其實就是學過的函數(shù),和函數(shù)唯一的區(qū)別是,靜態(tài)方法定義在類這個空間(類命名空間)中,而函數(shù)則定義在程序所在的空間(全局命名空間)中。

靜態(tài)方法沒有類似self、cls這樣的特殊參數(shù),因此Python解釋器不會對它包含的參數(shù)做任何類或?qū)ο蟮慕壎?。也正因為如此,類的靜態(tài)方法中無法調(diào)用任何類屬性和類方法。

在定義的時候需要使用裝飾器@staticmethod進行修飾。不需要聲明參數(shù),在調(diào)用時可以使用類本身以及實例對象將其調(diào)用?!纠?.11】靜態(tài)方法示例程序。classPerson:@staticmethoddefinfo(name,age):print(name,age)靜態(tài)方法的調(diào)用,既可以使用類名,也可以使用類對象。#使用類名直接調(diào)用靜態(tài)方法P("李明",20)#使用類對象調(diào)用靜態(tài)方法p=Person()("李明",20)3.類方法

第三種就是類方法,這個方法在定義時也是需要使用裝飾器修飾的,不過裝飾器的函數(shù)為classmethod。而且必須要最少有一個參數(shù),這個參數(shù)表示為類本身,在調(diào)用的時候卻是不需要傳入?yún)?shù)。Python類方法和實例方法相似,它最少也要包含一個參數(shù),只不過類方法中通常將其命名為cls,Python會自動將類本身綁定給cls參數(shù)。也就是說,在調(diào)用類方法時,無需顯式為cls參數(shù)傳參。和self一樣,cls參數(shù)的命名也不是規(guī)定的(可以隨意命名)。

類方法和實例方法最大的不同在于,在定義時也是需要使用裝飾器修飾,裝飾器的函數(shù)為classmethod?!纠?.12】類方法代碼示例。classPerson:#類構(gòu)造方法,也屬于實例方法def__init__(self,name,age):

=nameself.age=age#下面定義了一個類方法@classmethoddefinfo(cls):print("正在調(diào)用類方法",cls)

注意,如果沒有@classmethod,則Python解釋器會將info()方法認定為實例方法,而不是類方法。7.4繼承和多態(tài)1繼承

繼承描述的是事物之間的所屬關系,當定義一個class的時候,可以從某個現(xiàn)有的class繼承,新的class稱為子類或擴展類。被繼承的class稱為基類、父類、或者超類,父類的方法都會繼承給子類。子類將自動獲取父類的屬性和方法,即子類可不做任何代碼編寫即可使用父類的屬性和方法?!纠?.13】類的繼承示例。class

Person:

def__init__(self,name,age):

=name

self.age=age

defprint_age(self):

print("%s的年齡是%s"%(,self.age))classMan(Person):

passbob=Man('李明',33)bob.print_age()

繼承最大的好處就是子類可以獲取父類的所有功能。通過繼承可以最大限度的將通用的功能放入基類中減少代碼的維護成本。

當然也可以單獨為子類編寫它自己的方法,此時可以同時使用子類和父類的方法。

【例7.14】子類繼承父類的成員,并增加新的方法。classPerson:def__init__(self,name,age):=nameself.age=agedefprint_age(self):print("%s的年齡是%s"%(,self.age))classMan(Person):work="教師"

defprint_age(self):print("Mr.%s的年齡是%s"%(,self.age))

defprint_work(self):print("Mr.%s的工作是%s"%(,self.work))bob=Man('李明',33)bob.print_age()bob.print_work()

在以上代碼中,在子類Man中實現(xiàn)了print_age()方法和print_work()方法,從執(zhí)行結(jié)果可以看出,在Man類中的print_age方法覆蓋了Person類中的print_age方法。

父類:被繼承的類,子類繼承父類后,會繼承父類里面所有的屬性(數(shù)據(jù)屬性和實例屬性)以及方法。

子類:繼承其他的類,子類繼承父類后,能夠繼承父類里面所有的方法以及屬性,當然也可以調(diào)用。子類對父類構(gòu)造函數(shù)的調(diào)用有兩種方式,如下程序?!纠?.16】子類對父類構(gòu)造函數(shù)的調(diào)用的兩種方式。方式1:子類的構(gòu)造函數(shù)中,語句Person.__init__(self,name,sex),是用父類名調(diào)用構(gòu)造函數(shù)。

classPerson(object):def__init__(self,name,sex):=nameself.sex=sexclassChild(Person):#Child繼承Persondef__init__(self,name,sex,mother,father):Person.__init__(self,name,sex)#子類對父類的構(gòu)造方法的調(diào)用self.mother=motherself.father=father

Lice=Child("李明","男","王莉","李大強")print(L,Lice.sex,Lice.mother,Lice.father)方式2:程序中子類的構(gòu)造函數(shù),語句super(Child,self).__init__(name,sex),是用super()函數(shù)調(diào)用父類的構(gòu)造函數(shù)。classPerson(object):def__init__(self,name,sex):=nameself.sex=sexclassChild1(Person):#Child繼承Persondef__init__(self,name,sex,mother,father):

super(Child,self).__init__(name,sex)#子類對父類的構(gòu)造方法的調(diào)self.mother=motherself.father=fatheLice1=Child("李明","男","王莉","李大強")print(L,Lice1.sex,Lice1.mother,Lice1.father)

繼承的原則:(1).子類可以繼承多個父類,但是建議不要太多,最多兩個。(2).如果子類沒重寫父類的方法,調(diào)用父類的方法時,輸出的結(jié)果是父類里面方法的輸出結(jié)果。(3).如果子類重寫了父類里面的方法,那么調(diào)用該重寫的方法時,輸出的結(jié)果是子類里面方法的輸出結(jié)果。(4).從左到右原則:一個子類繼承多個父類,那么調(diào)用父類方法時,從左到右按線性的方式尋找,找到滿足的就不再繼續(xù)找了。(5).方法重寫:子類重寫了父類里面的方法。重寫的目的是父類的方法沒有辦法滿足子類的需求,那么就會重寫。7.4.2多態(tài)

當子類和父類中存在同樣的方法時,子類中的方法會覆蓋父類中的方法,面向?qū)ο蟮牧硗庖粋€特點:多態(tài)。

在Python中多態(tài)的使用可以總結(jié)為:對擴展開放,對修改封閉,即“開閉”原則。對擴展開放即可以隨意的增加父類的子類;對修改封閉即對于依賴父類的函數(shù),新增子類對該函數(shù)無任何影響,無需做任何修改?!纠?.17】多態(tài)示例程序。classPerson:def__init__(self,name,age):=nameself.age=agedefprint_age(self):print("%s的年齡是%s"%(,self.age))classMan(Person):defprint_age(self):print("Mr.%s的年齡是%s"%(,self.age))classWoman(Person):defprint_age(self):print("Ms.%s的年齡是%s"%(,self.age))defperson_age(person):person.print_age()person=Person("李明",23)man=Man("王強",33)woman=Woman("張莉",28)person_age(person)person_age(man)person_age(woman)在以上代碼中函數(shù)person_age函數(shù)的輸入?yún)?shù)為類Person的實例,但是在實際執(zhí)行過程中Person的子類Man和Woman的示例同樣可以在person_age函數(shù)中正常運行,這既是類的多態(tài)的作用。從上面程序可以看出,類的多態(tài)增加了靈活性,增加了額外擴展的功能。7.5訪問限制

在Python中,使用雙下劃線前綴來定義私有屬性和方法。私有屬性和方法只能在類內(nèi)部訪問,而不能在類外部訪問。這種訪問限制可以有效地保護數(shù)據(jù)和方法

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論