版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
封裝Python程序
使用函數(shù)封裝Python代碼目錄Content1使用面向?qū)ο笏枷腴_發(fā)Python2項(xiàng)目導(dǎo)言零
函數(shù)是一段可被重復(fù)使用的代碼,用于完成特定的任務(wù)。面向?qū)ο缶幊虅t是一種編程方法論,將對(duì)象作為程序的基本單元,通過定義類和實(shí)例來描述和操作對(duì)象之間的關(guān)系和交互。在函數(shù)式編程中,我們可以利用函數(shù)封裝常用的功能,以便在需要時(shí)進(jìn)行調(diào)用;而在面向?qū)ο缶幊讨校覀儎t需要結(jié)合對(duì)象的屬性和方法來完成更加復(fù)雜的任務(wù)。兩種編程方法都有其優(yōu)點(diǎn)與缺點(diǎn),具體應(yīng)用要根據(jù)需求進(jìn)行選擇。本項(xiàng)目主要通過函數(shù)編程和面向?qū)ο缶幊掏瓿僧a(chǎn)品數(shù)據(jù)的操作。學(xué)習(xí)目標(biāo)零知識(shí)目標(biāo)了解函數(shù)編程與面向?qū)ο缶幊痰囊饬x;熟悉函數(shù)作用域;掌握類和對(duì)象的關(guān)系;掌握類的定義與對(duì)象的實(shí)例化。能力目標(biāo)具備定義函數(shù)并調(diào)用函數(shù)的能力;具備定義類并實(shí)例化對(duì)象的能力;具備訪問類中屬性、方法的能力;具備函數(shù)式編程與面向?qū)ο缶幊痰哪芰ΑK仞B(yǎng)目標(biāo)具備善于發(fā)現(xiàn)和總結(jié)問題能力;具備強(qiáng)烈的責(zé)任心和積極的工作態(tài)度;具備很強(qiáng)的學(xué)習(xí)和溝通能力。任務(wù)4-1:使用函數(shù)封裝Python代碼壹1函數(shù)簡介
函數(shù)(function)是一種封裝代碼的機(jī)制,可以將大型程序分解成較小的可重用部分,包含一段完成特定任務(wù)的可重用代碼塊,能夠接受輸入?yún)?shù)、處理數(shù)據(jù),并返回輸出結(jié)果,以幫助程序員更好地組織和抽象代碼,從而增加代碼的可讀性、可維護(hù)性和可重用性。函數(shù)具有特點(diǎn)如下??芍赜眯远x函數(shù)一次,可以在多個(gè)地方調(diào)用,避免了重復(fù)編寫相同功能代碼的問題。參數(shù)傳遞函數(shù)可以接受不同類型的參數(shù),包括位置參數(shù)、關(guān)鍵字參數(shù)和默認(rèn)參數(shù)等。變量作用域函數(shù)中定義的變量只在函數(shù)內(nèi)部有效,不會(huì)影響到函數(shù)外部的變量??勺冃院瘮?shù)可以返回不同類型和數(shù)量的數(shù)據(jù),支持多值返回和多級(jí)返回等。任務(wù)4-1:使用函數(shù)封裝Python代碼壹2函數(shù)定義與調(diào)用1、函數(shù)定義
目前,Python函數(shù)是由def關(guān)鍵字定義的可重復(fù)使用的代碼塊,用于執(zhí)行特定任務(wù)并返回一個(gè)值。并且,它可以接受任意數(shù)量和類型的輸入?yún)?shù),并在執(zhí)行操作后生成輸出結(jié)果,語法格式如下所示。deffunction_name(parameters):"""函數(shù)文檔字符串"""function_bodyreturn[expression]參數(shù)說明如表所示。參數(shù)描述function_name函數(shù)名稱parameters函數(shù)參數(shù)列表,用來接收調(diào)用函數(shù)時(shí)傳遞的參數(shù)function_body函數(shù)體,是實(shí)現(xiàn)函數(shù)功能的代碼塊return[expression]函數(shù)的返回值,可以是任何Python對(duì)象,如果沒有指定返回值,默認(rèn)返回None任務(wù)4-1:使用函數(shù)封裝Python代碼壹2、函數(shù)參數(shù)目前,Python函數(shù)根據(jù)參數(shù)的設(shè)置方式,可以分為位置參數(shù)、關(guān)鍵字參數(shù)、默認(rèn)參數(shù)以及可變參數(shù)。deffunction_name(parameter1,parameter2,...):function_bodyreturn[expression]function_name(value1,value2,...)(1)位置參數(shù)
位置參數(shù)是指函數(shù)定義時(shí)按照順序所定義的參數(shù),調(diào)用函數(shù)時(shí)需要按照相同的順序傳入?yún)?shù),它們的數(shù)量和位置必須一一對(duì)應(yīng),語法格式如下所示。任務(wù)4-1:使用函數(shù)封裝Python代碼壹參數(shù)說明如表所示。參數(shù)描述function_name函數(shù)名稱parameter1,parameter2,...函數(shù)定義時(shí)的參數(shù)名value1,value2,...與參數(shù)一一對(duì)應(yīng)的值例如,定義一個(gè)名為“add”的函數(shù),接受兩個(gè)位置參數(shù)x和y,并將它們相加后返回結(jié)果,代碼如下所示。defadd(x,y):returnx+yresult=add(1,2)print(result)#輸出3任務(wù)4-1:使用函數(shù)封裝Python代碼壹(2)關(guān)鍵字參數(shù)
基于關(guān)鍵字參數(shù)定義的函數(shù)與位置參數(shù)定義的函數(shù)基本相同,不同之處在于關(guān)鍵字參數(shù)定義函數(shù)在調(diào)用時(shí),可以通過指定參數(shù)名稱來傳遞參數(shù)值,不需要按照參數(shù)定義順序來傳遞參數(shù),這樣可以避免因?yàn)槲恢庙樞蝈e(cuò)誤導(dǎo)致的錯(cuò)誤。基于關(guān)鍵字參數(shù)定義函數(shù)的調(diào)用語法格式如下所示。function_name(parameter1=value1,parameter2=value2,...)例如,定義一個(gè)名為“greet”的函數(shù),接受兩個(gè)關(guān)鍵字參數(shù)name和message,調(diào)用時(shí)按照參數(shù)名稱傳遞參數(shù)值,可以不必關(guān)心參數(shù)的定義順序,代碼如下所示。defgreet(name,message):print(f'Hello,{name}!{message}')result1=greet(name='Alice',message='Howareyou?')print(result1)#輸出Hello,Alice!Howareyou?result2=greet(message='Whatareyoudoing?',name='Bob')print(result2)#輸出Hello,Bob!Whatareyoudoing?任務(wù)4-1:使用函數(shù)封裝Python代碼壹(3)默認(rèn)參數(shù)
默認(rèn)參數(shù)是指在函數(shù)定義時(shí)為參數(shù)設(shè)置默認(rèn)值,在調(diào)用函數(shù)時(shí)如果沒有傳遞參數(shù),則使用默認(rèn)值。例如,定義一個(gè)名為“greet”的函數(shù),接受兩個(gè)參數(shù)name和message,其中message參數(shù)采用默認(rèn)參數(shù)的語法,設(shè)置默認(rèn)值為“Howareyou?”,代碼如下所示。defgreet(name,message="Howareyou?"):print(f"Hello,{name}!{message}")print(greet("Alice"))#輸出"Hello,Alice!Howareyou?"print(greet("Bob","Fine"))#輸出"Hello,Bob!Fine"任務(wù)4-1:使用函數(shù)封裝Python代碼壹(4)可變參數(shù)
可變參數(shù)是指在函數(shù)定義中可以接受不定數(shù)量的參數(shù)。Python中有兩種方式實(shí)現(xiàn)可變參數(shù),分別是帶星號(hào)的位置參數(shù)、帶星號(hào)的關(guān)鍵字參數(shù)。帶星號(hào)的位置參數(shù)
Python中的基于帶星號(hào)位置參數(shù)函數(shù)的定義使用一個(gè)星號(hào)“*”將參數(shù)標(biāo)記為可變參數(shù),這個(gè)帶星號(hào)的位置參數(shù)將會(huì)接收到函數(shù)調(diào)用時(shí)傳入的所有位置參數(shù),并且以元組(tuple)的形式傳遞給函數(shù)體內(nèi)部,從而允許編寫能夠接受任意數(shù)量位置參數(shù)的函數(shù),語法格式如下所示。deffunction_name(parameter1,parameter2,...,*args):function_bodyreturn[expression]function_name(value1,value2,...)任務(wù)4-1:使用函數(shù)封裝Python代碼壹
其中,parameter1、parameter2等是普通的參數(shù),而*args則是帶星號(hào)的位置參數(shù),當(dāng)調(diào)用該函數(shù)時(shí),可以通過傳入任意數(shù)量的位置參數(shù)來給*args賦值。
例如,定義一個(gè)名為“func”的函數(shù),它有兩個(gè)普通的參數(shù)a和b,以及一個(gè)帶星號(hào)的位置參數(shù)*args。在函數(shù)體內(nèi),使用print()方法打印出a、b以及args參數(shù)的值,代碼如下所示。deffunc(a,b,*args):print(f"a={a}")print(f"b=")print(f"args={args}")func(1,2,3,4,5)#輸出a=1b=2args=(3,4,5)任務(wù)4-1:使用函數(shù)封裝Python代碼壹帶星號(hào)的關(guān)鍵字參數(shù)
與帶星號(hào)的位置參數(shù)類似,帶星號(hào)的關(guān)鍵字參數(shù)通過兩個(gè)星號(hào)(**)將函數(shù)定義中的參數(shù)標(biāo)記為可變參數(shù),可以接受任意數(shù)量的關(guān)鍵字參數(shù),在函數(shù)內(nèi)部將其作為字典(dictionary)類型來處理在,語法格式如下所示。deffunction_name(parameter1,parameter2,...,**kwargs):function_bodyreturn[expression]function_name(parameter1=value1,parameter2=value2,...)任務(wù)4-1:使用函數(shù)封裝Python代碼壹例如,將帶星號(hào)的位置參數(shù)修改為帶星號(hào)的關(guān)鍵字參數(shù),代碼如下所示。deffunc(a,b,**kwargs):print(f"a={a}")print(f"b=")print(f"kwargs={kwargs}")func(a=1,b=2,c=3,d=4,e=5)#輸出a=1b=2kwargs={'c':3,'d':4,'e':5}任務(wù)4-1:使用函數(shù)封裝Python代碼壹3作用域(1)局部作用域
局部作用域是指變量的可見性和生命周期所適用的函數(shù)內(nèi)部區(qū)域。通常情況下,一個(gè)函數(shù)內(nèi)部定義的變量只在該函數(shù)內(nèi)部可見,超出該函數(shù)范圍時(shí),該變量就被銷毀。簡單來說,當(dāng)在一個(gè)函數(shù)內(nèi)部定義一個(gè)變量時(shí),它只會(huì)在該函數(shù)內(nèi)部有效,不能被其他函數(shù)訪問。當(dāng)函數(shù)執(zhí)行完畢后,所有在該函數(shù)內(nèi)部定義的變量都將被銷毀,即這些變量的生命周期僅限于函數(shù)內(nèi)部。
例如,定義一個(gè)函數(shù)func,并在該函數(shù)內(nèi)部定義一個(gè)局部變量x后,在不同區(qū)域?qū)ψ兞縳進(jìn)行訪問,代碼如下所示。deffunc():x=10#定義一個(gè)局部變量xprint("變量x的值為:",x)func()#輸出:變量x的值為:10print("變量x的值為:",x)#報(bào)錯(cuò):NameError:name'x'isnotdefined任務(wù)4-1:使用函數(shù)封裝Python代碼壹
在函數(shù)內(nèi)部如果要訪問全局變量,則需要使用global關(guān)鍵字來聲明該變量為全局變量。否則,Python會(huì)將該變量視為局部變量,從而導(dǎo)致意料之外的錯(cuò)誤。同時(shí),我們應(yīng)該盡量避免在不同函數(shù)中定義同名的局部變量,這樣可能會(huì)導(dǎo)致變量名沖突和代碼可讀性變差等問題。
例如,修改上述代碼,將局部變量x聲明為全局變量并訪問,代碼如下所示。deffunc():globalx=10#定義一個(gè)全局變量xprint("變量x的值為:",x)func()#輸出:變量x的值為:10print("變量x的值為:",x)#輸出:變量x的值為:10任務(wù)4-1:使用函數(shù)封裝Python代碼壹(2)嵌套作用域defouter():x="outerx"definner():nonlocalxx="innerx"print("inner函數(shù)中的變量x值為:",x)inner()print("outer函數(shù)中的變量x值為:",x)outer()#輸出:inner函數(shù)中的變量x值為:innerx#outer函數(shù)中的變量x值為:innerx在嵌套作用域中,內(nèi)層函數(shù)可以訪問外層函數(shù)中定義的變量,而外層函數(shù)卻不能訪問內(nèi)層函數(shù)中的變量。如果函數(shù)內(nèi)部定義了一個(gè)與外層函數(shù)或全局作用域中同名的變量,那么Python將優(yōu)先使用內(nèi)部變量。例如,定義兩個(gè)函數(shù)outer和inner,其中inner位于outer的內(nèi)部。另外,在outer中定義了一個(gè)變量x,并將其值設(shè)為“outerx”。在inner函數(shù)中定義了一個(gè)同名變量x,并將其值設(shè)為“innerx”。在inner函數(shù)中,使用nonlocal關(guān)鍵字來聲明x變量為外層函數(shù)outer中的變量。在執(zhí)行完inner函數(shù)后,outer函數(shù)將再次使用x變量并打印它的值,代碼如下所示。任務(wù)4-1:使用函數(shù)封裝Python代碼壹(3)全局作用域x=10#定義一個(gè)全局變量deffunc():globalx#聲明x為全局變量x=20print("函數(shù)內(nèi)部的變量x值為:",x)func()#輸出:函數(shù)內(nèi)部的變量x值為:20print("函數(shù)外部的變量x值為:",x)#輸出:函數(shù)外部的變量x值為:20定義一個(gè)全局變量x,并在函數(shù)func內(nèi)部使用global關(guān)鍵字來聲明該變量為全局變量。在func函數(shù)內(nèi)部,將x的值修改為20,并打印出修改后的值。另外,在函數(shù)執(zhí)行完畢后,需再次使用x變量并打印它的值,代碼如下所示。(4)內(nèi)置作用域在Python中,內(nèi)置作用域是指Python內(nèi)置函數(shù)和模塊中的變量和函數(shù)所適用的范圍。內(nèi)置作用域中的變量可以被任何模塊或函數(shù)直接訪問。任務(wù)4-1:使用函數(shù)封裝Python代碼壹4匿名函數(shù)與遞歸函數(shù)1、匿名函數(shù)匿名函數(shù)是一種沒有名稱的函數(shù),通常用于需要傳遞一個(gè)簡單函數(shù)作為參數(shù)的場合。與普通函數(shù)相比,匿名函數(shù)的主要特點(diǎn)有以下幾個(gè)方面:匿名函數(shù)沒有名稱,只能通過賦值給一個(gè)變量或傳遞給其他函數(shù)來使用。沒有函數(shù)名匿名函數(shù)的返回值就是表達(dá)式的值,不需要使用return語句顯式返回。返回值為表達(dá)式的值匿名函數(shù)只能包含一個(gè)表達(dá)式作為函數(shù)體,不能包含賦值語句、條件語句等復(fù)雜語句。只有一個(gè)表達(dá)式任務(wù)4-1:使用函數(shù)封裝Python代碼壹在Python中,可以使用lambda表達(dá)式來實(shí)現(xiàn)匿名函數(shù)的創(chuàng)建操作,語法格式如下所示。lambda參數(shù)列表:表達(dá)式其中,參數(shù)列表表示需要傳遞給函數(shù)的參數(shù),可以包含零個(gè)或多個(gè)參數(shù);表達(dá)式表示函數(shù)的返回值,可以是任意合法的Python表達(dá)式。例如,使用lambda表達(dá)式創(chuàng)建一個(gè)匿名函數(shù),該函數(shù)接受兩個(gè)參數(shù)并返回它們的和,代碼如下所示。#定義一個(gè)簡單的lambda函數(shù)add=lambdax,y:x+y#調(diào)用匿名函數(shù)result=add(10,20)print("10+20=",result)#輸出:10+20=30任務(wù)4-1:使用函數(shù)封裝Python代碼壹2、遞歸函數(shù)deffactorial(n):#基線條件:n為1時(shí)直接返回1ifn==1:return1#遞歸條件:將問題拆分成更小的子問題并通過遞歸調(diào)用自身來解決else:returnn*factorial(n-1)#測試print(factorial(5))#輸出120目前,遞歸函數(shù)的實(shí)現(xiàn)需要滿足兩個(gè)條件,分別是基線條件和遞歸條件。其中,基線條件是指當(dāng)問題變得足夠簡單時(shí)直接返回結(jié)果,而遞歸條件則是指將問題拆分成更小的子問題并通過遞歸調(diào)用自身來解決。另外,遞歸函數(shù)雖然可以解決很多問題,但也有一些缺點(diǎn),如下:遞歸函數(shù)會(huì)消耗大量的內(nèi)存,因?yàn)槊看握{(diào)用都會(huì)在棧上創(chuàng)建一個(gè)新的函數(shù)幀。遞歸函數(shù)在某些情況下可能會(huì)導(dǎo)致堆棧溢出,因?yàn)檫f歸深度過大會(huì)使得??臻g不足。任務(wù)4-1:使用函數(shù)封裝Python代碼壹5內(nèi)置函數(shù)(1)數(shù)學(xué)函數(shù)數(shù)學(xué)函數(shù)用于執(zhí)行各種數(shù)學(xué)計(jì)算,例如對(duì)數(shù)字取整、計(jì)算三角函數(shù)、對(duì)數(shù)等,常用函數(shù)如表所示。函數(shù)描述abs()返回一個(gè)數(shù)字的絕對(duì)值divmod()將兩個(gè)數(shù)字相除并返回商和余數(shù)pow()返回一個(gè)數(shù)字的指定次冪round()返回一個(gè)數(shù)字的四舍五入值sum()對(duì)一個(gè)迭代器內(nèi)的所有元素進(jìn)行求和任務(wù)4-1:使用函數(shù)封裝Python代碼壹(2)序列函數(shù)序列函數(shù)用于處理序列(列表、元組等),例如在序列中查找特定元素、對(duì)序列進(jìn)行排序、計(jì)算序列的長度等,常用函數(shù)如表所示。函數(shù)描述len()返回容器(列表、元組、字典)元素個(gè)數(shù)sorted()返回一個(gè)排好序的列表max()返回給定參數(shù)中的最大值min()返回給定參數(shù)中的最小值enumerate()從一個(gè)序列中返回索引和對(duì)應(yīng)的元素reversed()對(duì)一個(gè)序列反向迭代zip()將可迭代對(duì)象中對(duì)應(yīng)的元素打包成一個(gè)元組任務(wù)4-1:使用函數(shù)封裝Python代碼壹(3)字符串函數(shù)字符串函數(shù)用于操作字符串,例如將字符串轉(zhuǎn)換為大寫、去除字符串中的空格、檢測字符串是否以特定字符開頭或結(jié)尾等,常用函數(shù)如表所示。函數(shù)描述len()計(jì)算一個(gè)字符串中字符的數(shù)量upper()將字符串中的所有字符轉(zhuǎn)換為大寫lower()將字符串中的所有字符轉(zhuǎn)換為小寫strip()返回一個(gè)從兩端移除的字符串副本replace()返回指定子字符串替換舊字符串后生成的新字符串任務(wù)4-1:使用函數(shù)封裝Python代碼壹(4)類型轉(zhuǎn)換函數(shù)Python的類型轉(zhuǎn)換函數(shù)可以將一個(gè)數(shù)據(jù)類型轉(zhuǎn)換為另一個(gè)數(shù)據(jù)類型。在編程中,經(jīng)常需要將不同類型的數(shù)據(jù)傳遞給一個(gè)函數(shù)或操作符,并且它們需要相同的數(shù)據(jù)類型才能正常工作,常用函數(shù)如表所示。函數(shù)描述int()將一個(gè)數(shù)值或字符串轉(zhuǎn)換為整型。將一個(gè)數(shù)值或字符串轉(zhuǎn)換為浮點(diǎn)型float()將一個(gè)數(shù)值或字符串轉(zhuǎn)換為浮點(diǎn)型str()將一個(gè)對(duì)象轉(zhuǎn)換為字符串類型bool()將一個(gè)值轉(zhuǎn)換為布爾類型list()將一個(gè)序列或可迭代對(duì)象轉(zhuǎn)換為列表類型tuple()將一個(gè)序列或可迭代對(duì)象轉(zhuǎn)換為元組類型set()將一個(gè)序列或可迭代對(duì)象轉(zhuǎn)換為集合類型dict()將包含鍵值對(duì)元素的二元組列表或元組列表轉(zhuǎn)換為字典、將包含鍵和值的元素的二元組或元組序列轉(zhuǎn)換為字典或者將包含鍵和值的字符串轉(zhuǎn)換為字典任務(wù)4-1:使用函數(shù)封裝Python代碼壹(5)文件函數(shù)文件函數(shù)用于讀取、寫入和處理文件,例如打開、關(guān)閉、讀取或?qū)懭胛募龋S煤瘮?shù)如表所示。函數(shù)描述open()打開一個(gè)文件并返回文件對(duì)象read()從文件中讀取數(shù)據(jù)write()向文件中寫入數(shù)據(jù)close()關(guān)閉文件對(duì)象(6)其他函數(shù)除了用于對(duì)某類數(shù)據(jù)進(jìn)行操作的函數(shù)外,Python還提供其他函數(shù),具有專門功能,可以獲取幫助信息、查看對(duì)象屬性等,常用函數(shù)如表所示。函數(shù)描述type()返回變量的數(shù)據(jù)類型id()返回變量的唯一標(biāo)識(shí)符range()成一個(gè)指定范圍內(nèi)的整數(shù)序列help()獲取Python幫助文檔任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳1面向?qū)ο蠛喗榉庋b封裝是指對(duì)象的屬性和方法被隔離在對(duì)象的內(nèi)部,對(duì)象的外部無法直接訪問它們,必須通過公共接口才能訪問。這種機(jī)制又被稱為信息隱藏,可以避免對(duì)象的數(shù)據(jù)被意外地改變,從而提高了代碼的安全性和可靠性。繼承繼承是指一個(gè)類(子類)可以基于另一個(gè)已經(jīng)存在的類(父類)創(chuàng)建出新的類,繼承了父類的一些特征并且可以對(duì)其進(jìn)行修改或擴(kuò)展。繼承允許代碼的重用,同時(shí)也便于代碼的后期維護(hù)。多態(tài)多態(tài)性是指同一種類型的對(duì)象在不同的情境下可以對(duì)同一個(gè)消息產(chǎn)生不同的響應(yīng)。比如,在一個(gè)基于動(dòng)物的模型中,狗和人都有“走路”的功能,但是它們的實(shí)現(xiàn)方式是不同的。多態(tài)是OOP的一個(gè)重要特性,可以提高代碼的可擴(kuò)展性和靈活性。任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳在面向?qū)ο缶幊讨?,類是一種抽象數(shù)據(jù)類型,用于描述具有相同屬性和方法的對(duì)象。簡單來說,一個(gè)類就是一個(gè)對(duì)象的藍(lán)圖,定義了這個(gè)對(duì)象有哪些特征(即屬性)和可以做什么(即方法)。例如,有一個(gè)學(xué)生類,類中包含了姓名、年齡、班級(jí)等特征,如圖所示。2類任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳在Python中,通過關(guān)鍵字class結(jié)合類名稱實(shí)現(xiàn)類的定義,語法格式如下所示。classClassName:def__init__(self,arg1,arg2,...):self.instance_variable=valuedefmethod(self,arg1,arg2,...):...參數(shù)說明如表所示。參數(shù)描述ClassName類的名稱__init__()構(gòu)造函數(shù),在創(chuàng)建該類的實(shí)例時(shí)會(huì)自動(dòng)調(diào)用并初始化實(shí)例變量。在構(gòu)造函數(shù)中,第一個(gè)參數(shù)self表示實(shí)例本身,后面的參數(shù)是用于初始化實(shí)例變量的值method()類的方法,可以訪問實(shí)例變量和其他函數(shù),并實(shí)現(xiàn)該類的具體功能任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳對(duì)象(Object)是面向?qū)ο缶幊讨械幕靖拍钪?,可以看作是類的?shí)例,具有類定義的屬性和方法,通過對(duì)這些屬性和方法的操作來實(shí)現(xiàn)程序的邏輯功能;同時(shí),對(duì)象也是實(shí)現(xiàn)封裝、繼承和多態(tài)等特性的基礎(chǔ)。3對(duì)象在面向?qū)ο缶幊讨校總€(gè)對(duì)象都有自己的狀態(tài)和行為,對(duì)象間可以相互作用和通信。比如,定義一個(gè)“汽車”類,每輛具體的車就是該類的一個(gè)實(shí)例,具有各自的品牌、型號(hào)、顏色等屬性,并可以進(jìn)行加速、剎車等操作,對(duì)象如圖所示。任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳在Python中,可以通過類的實(shí)例化操作來創(chuàng)建對(duì)象,只需在類名稱后使用小括號(hào)“()”并加入值即可,語法格式如下所示。obj=ClassName(arg1,arg2,...)參數(shù)說明如表所示。參數(shù)描述obj自定義的示例名稱,可以根據(jù)需要任取一個(gè)合適的名字ClassName類的名稱arg1,arg2,...用于初始化實(shí)例變量的值任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳例如,定義Person類后,創(chuàng)建人的實(shí)例,代碼如下所示。classPerson:def__init__(self,name,age):=nameself.age=agedefdescribe(self):print(f"Mynameis{}andI'm{self.age}yearsold.")#創(chuàng)建兩個(gè)Person實(shí)例p1=Person("Alice",25)p2=Person("Bob",30)#調(diào)用describe方法p1.describe()#輸出:MynameisAliceandI'm25yearsold.p2.describe()#輸出:MynameisBobandI'm30yearsold.任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳1、內(nèi)置屬性4屬性在Python中,每個(gè)對(duì)象都有一些內(nèi)置的屬性,是Python中已經(jīng)預(yù)定義好的特殊屬性,用于描述對(duì)象及其狀態(tài),在使用時(shí),只需通過“.屬性名稱”進(jìn)行訪問,常用內(nèi)置屬性如表所示。屬性描述__class__表示實(shí)例所屬的類__name__表示類、函數(shù)或模塊的名字__doc__表示類、函數(shù)或模塊的文檔字符串__module__表示對(duì)象所在的模塊名。對(duì)于動(dòng)態(tài)創(chuàng)建的對(duì)象,該屬性的值為“main”__bases__表示當(dāng)前類的所有父類構(gòu)成的元組任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳例如,定義名為“MyClass”的類后,使用不同的內(nèi)置屬性獲取對(duì)象的相關(guān)信息,代碼如下所示。classMyClass:"""我的類"""def__init__(self,name):=namedefsay_hello(self):print(f"你好,我是{}!")print(MyClass.__name__)#輸出:MyClassprint(MyClass.__doc__)#輸出:我的類print(MyClass.__module__)#輸出:__main__print(MyClass.__bases__)#輸出:(<class'object'>,)任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳2、自定義屬性classPerson:def__init__(self,name,age):=name#公有屬性self.age=age#公有屬性p=Person("Alice",25)print()#輸出:Aliceprint(p.age)#輸出:25除內(nèi)置屬性外,Python中還可以通過在__init__()方法中使用“self.屬性名稱=屬性名稱”的賦值方式實(shí)現(xiàn)對(duì)象公有屬性(可以在任何地方訪問)的自定義。例如,在Person類中,通過“=name”和“self.age=age”的方式創(chuàng)建兩個(gè)對(duì)象屬性,分別表示該實(shí)例對(duì)象的名字和年齡,代碼如下所示。任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳classPerson:def__init__(self,name,age):=name#公有屬性self.__age=age#私有屬性p=Person("Alice",25)print()#輸出:Aliceprint(p.__age)#拋出AttributeError異常并且,在Python中,對(duì)象除了公有屬性外,還存在不能在類的外部直接訪問的私有屬性,只需在定義對(duì)象屬性時(shí),在“self.”與屬性名稱之間加入雙下劃線“__”即可,這時(shí)該屬性只能在類的內(nèi)部使用,無法從外部直接訪問。例如,將Person類中age屬性修改為私有屬性并訪問,代碼如下所示。任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳delp.age#刪除對(duì)象屬性print(hasattr(p,"age"))#輸出:False,表示對(duì)象中不存在age屬性需要注意的是,對(duì)象屬性的名稱通常與類屬性和實(shí)例方法的名稱不同,以避免沖突。在訪問對(duì)象屬性時(shí),通常使用點(diǎn)號(hào)“.”實(shí)現(xiàn)。另外,如果需要?jiǎng)h除對(duì)象屬性,可以使用del關(guān)鍵字來刪除,刪除后的屬性再次被訪問時(shí),會(huì)引發(fā)AttributeError異常;并且為避免觸發(fā)錯(cuò)誤,可以通過使用hasattr()函數(shù)判斷一個(gè)對(duì)象屬性是否存在的方式,返回值為True或False。例如,刪除Person類中的age屬性并判斷其是否存在,代碼如下所示。任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳1、實(shí)例方法5方法實(shí)例方法是指需要通過對(duì)象實(shí)例來調(diào)用的方法,它的第一個(gè)參數(shù)通常是self,用于表示該方法所屬的對(duì)象實(shí)例。在調(diào)用實(shí)例方法時(shí),對(duì)象實(shí)例會(huì)自動(dòng)作為第一個(gè)參數(shù)傳入,因此無需顯式地傳遞該參數(shù),語法格式如下所示。classMyClass:definstance_method(self,arg1,arg2,...):#方法體pass任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳參數(shù)說明如表所示。參數(shù)描述instance_method方法名稱self表示方法所屬的對(duì)象實(shí)例arg1,arg2,...傳遞給方法的參數(shù)classPerson:def__init__(self,name,age):=nameself.age=agedefsay_hello(self):print("Hello,I'm{}andI'm{}yearsold.".format(,self.age))person=Person("Alice",25)person.say_hello()#輸出:Hello,I'mAliceandI'm25yearsold.任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳2、類方法類方法是指需要通過類來調(diào)用的方法,它的第一個(gè)參數(shù)通常是cls,用于表示該方法所屬的類。在調(diào)用類方法時(shí),Python會(huì)自動(dòng)將當(dāng)前類作為第一個(gè)參數(shù)傳入,因此無需顯式地傳遞該參數(shù)。并且,在類方法上方需要使用裝飾器@classmethod來聲明該方法是一個(gè)類方法,語法格式如下所示。classMyClass:@classmethoddefclass_method(cls,arg1,arg2,...):#方法體pass參數(shù)說明如表所示。參數(shù)描述class_method方法名稱cls表示方法所屬的類arg1,arg2,...傳遞給方法的參數(shù)任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳例如,定義一個(gè)包含count屬性名為“Person”的類,之后定義一個(gè)類方法“get_count”,用于返回當(dāng)前已經(jīng)創(chuàng)建的人員實(shí)例的數(shù)量,代碼如下所示。classPerson:count=0def__init__(self,name,age):=nameself.age=agePerson.count+=1@classmethoddefget_count(cls):returncls.countperson1=Person("Alice",25)person2=Person("Bob",30)print(Person.get_count())#輸出:2任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳3、靜態(tài)方法靜態(tài)方法是指不需要與類或?qū)ο蠼壎ㄔ谝黄鸬姆椒ǎ粫?huì)自動(dòng)接收任何參數(shù),而是需要顯式地傳遞參數(shù)。靜態(tài)方法通常用于輔助實(shí)現(xiàn)某個(gè)功能,而不涉及類或?qū)ο蟮臓顟B(tài),因此不能通過self或cls來引用對(duì)象實(shí)例或類。并且,靜態(tài)方法同樣需要使用裝飾器聲明,這里使用的是@staticmethod,語法格式如下所示。classMyClass:@staticmethoddefstatic_method(arg1,arg2,...):#方法體pass任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳參數(shù)說明如表所示。參數(shù)描述static_method方法名稱arg1,arg2,...傳遞給方法的參數(shù)例如,定義一個(gè)名為“Math”的類,包含一個(gè)用于計(jì)算兩個(gè)數(shù)的平均值的靜態(tài)方法,代碼如下所示。classMath:@staticmethoddefaverage(a,b):return(a+b)/2print(Math.average(3,5))#輸出:4.0任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳4、屬性方法屬性方法是一種特殊類型的方法,可以讓一個(gè)類的方法表現(xiàn)得像類的屬性一樣。簡單來說,就是屬性方法盡管被定義為一個(gè)函數(shù),但是在使用時(shí),可以像訪問屬性一樣去訪問它,而且無需在代碼中顯式調(diào)用該方法(即不需要在方法名后面加上“()”)。另外,屬性方法的返回值通常是對(duì)象的某個(gè)屬性,但也可以根據(jù)需要返回計(jì)算值。并且,屬性方法同樣需要使用修飾器@property來聲明該方法是一個(gè)屬性方法,語法格式如下所示。classMyClass:@propertydefproperty_method(self):#方法體pass任務(wù)4-2使用面向?qū)ο笏枷腴_發(fā)Python貳參數(shù)說明如表所示。參數(shù)描述property_method方法名
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國安全軟件行業(yè)發(fā)展現(xiàn)狀及投資商業(yè)模式分析報(bào)告
- 2024-2030年中國聲磁軟標(biāo)簽行業(yè)運(yùn)營模式及發(fā)展策略分析報(bào)告
- 2024-2030年中國壓裂車行業(yè)發(fā)展需求及投資戰(zhàn)略研究報(bào)告版
- 2024年土地儲(chǔ)備土地轉(zhuǎn)租交易服務(wù)合同模板3篇
- 梅河口康美職業(yè)技術(shù)學(xué)院《嵌入式系統(tǒng)設(shè)計(jì)及應(yīng)用》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年房屋代售全權(quán)協(xié)議3篇
- 主題訓(xùn)練-“大美?長沙”VI基礎(chǔ)系統(tǒng)設(shè)計(jì)
- 2024年度領(lǐng)養(yǎng)孤兒及棄嬰家庭關(guān)愛與教育協(xié)議書范本下載3篇
- 2024年物聯(lián)網(wǎng)智能家居系統(tǒng)研發(fā)合作合同
- 洛陽文化旅游職業(yè)學(xué)院《新能源汽車概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 案例報(bào)告(認(rèn)知行為療法)
- 第10課+古代的村落、集鎮(zhèn)和城市【知識(shí)精講精研】高二歷史統(tǒng)編版(2019)選擇性必修2
- 《無線網(wǎng)絡(luò)優(yōu)化概述》課件
- 蘇州蘇州外國語學(xué)校初一語文自主招生試卷模擬試題(5套帶答案)
- 國開國際經(jīng)濟(jì)法形考任務(wù)1-4試題及答案
- 施工場地移交交接單
- 員工上下班交通安全
- 研究生英語綜合教程Unit-答案 1
- 鋼板鋪設(shè)施工方案
- 產(chǎn)程中的人文關(guān)懷61張課件
- 海南省普通中小學(xué)教師工作量指導(dǎo)標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論