目錄
?編輯
8.6.4 使用 as 給模塊指定別名
8.6.5 導(dǎo)入模塊中的所有函數(shù)
8.7 函數(shù)編寫指南
8.8 小結(jié)
第9章
類
9.1 創(chuàng)建和使用類
9.1.1 創(chuàng)建 Dog 類
dog.py
1. 方法__init__()
2. 在Python 2.7中創(chuàng)建類
9.1.2 根據(jù)類創(chuàng)建實(shí)例
1. 訪問(wèn)屬性
2. 調(diào)用方法
3. 創(chuàng)建多個(gè)實(shí)例
往期快速傳送門??(在文章最后):
感謝大家的支持!歡迎訂閱收藏!專欄將持續(xù)更新!
8.6.4 使用 as 給模塊指定別名
你還可以給模塊指定別名。通過(guò)給模塊指定簡(jiǎn)短的別名(如給模塊pizza指定別名p),讓你 能夠更輕松地調(diào)用模塊中的函數(shù)。相比于pizza.make_pizza(),p.make_pizza()更為簡(jiǎn)潔:
import pizza as p
p.make_pizza(16, 'pepperoni')
p.make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
上述import語(yǔ)句給模塊pizza指定了別名p,但該模塊中所有函數(shù)的名稱都沒(méi)變。調(diào)用函數(shù) make_pizza()時(shí),可編寫代碼p.make_pizza()而不是pizza.make_pizza(),這樣不僅能使代碼更簡(jiǎn) 潔,還可以讓你不再關(guān)注模塊名,而專注于描述性的函數(shù)名。這些函數(shù)名明確地指出了函數(shù)的功 能,對(duì)理解代碼而言,它們比模塊名更重要。 給模塊指定別名的通用語(yǔ)法如下:
import module_name as mn
8.6.5 導(dǎo)入模塊中的所有函數(shù)
使用星號(hào)(*)運(yùn)算符可讓Python導(dǎo)入模塊中的所有函數(shù)
from pizza import *
make_pizza(16, 'pepperoni')
make_pizza(12, 'mushrooms', 'green peppers', 'extra cheese')
import語(yǔ)句中的星號(hào)讓Python將模塊pizza中的每個(gè)函數(shù)都復(fù)制到這個(gè)程序文件中。由于導(dǎo)入 了每個(gè)函數(shù),可通過(guò)名稱來(lái)調(diào)用每個(gè)函數(shù),而無(wú)需使用句點(diǎn)表示法。然而,使用并非自己編寫的 大型模塊時(shí),最好不要采用這種導(dǎo)入方法:如果模塊中有函數(shù)的名稱與你的項(xiàng)目中使用的名稱相 同,可能導(dǎo)致意想不到的結(jié)果:Python可能遇到多個(gè)名稱相同的函數(shù)或變量,進(jìn)而覆蓋函數(shù),而不是分別導(dǎo)入所有的函數(shù)。
最佳的做法是,要么只導(dǎo)入你需要使用的函數(shù),要么導(dǎo)入整個(gè)模塊并使用句點(diǎn)表示法。這能 讓代碼更清晰,更容易閱讀和理解。這里之所以介紹這種導(dǎo)入方法,只是想讓你在閱讀別人編寫 的代碼時(shí),如果遇到類似于下面的import語(yǔ)句,能夠理解它們
from module_name import *
8.7 函數(shù)編寫指南
編寫函數(shù)時(shí),需要牢記幾個(gè)細(xì)節(jié)。應(yīng)給函數(shù)指定描述性名稱,且只在其中使用小寫字母和下 劃線。描述性名稱可幫助你和別人明白代碼想要做什么。給模塊命名時(shí)也應(yīng)遵循上述約定。
每個(gè)函數(shù)都應(yīng)包含簡(jiǎn)要地闡述其功能的注釋,該注釋應(yīng)緊跟在函數(shù)定義后面,并采用文檔字 符串格式。文檔良好的函數(shù)讓其他程序員只需閱讀文檔字符串中的描述就能夠使用它:他們完全 可以相信代碼如描述的那樣運(yùn)行;只要知道函數(shù)的名稱、需要的實(shí)參以及返回值的類型,就能在 自己的程序中使用它。
給形參指定默認(rèn)值時(shí),等號(hào)兩邊不要有空格:
def function_name(parameter_0, parameter_1='default value')
對(duì)于函數(shù)調(diào)用中的關(guān)鍵字實(shí)參,也應(yīng)遵循這種約定:
function_name(value_0, parameter_1='value')
PEP 8(https://www.python.org/dev/peps/pep-0008/)建議代碼行的長(zhǎng)度不要超過(guò)79字符,這樣 只要編輯器窗口適中,就能看到整行代碼。如果形參很多,導(dǎo)致函數(shù)定義的長(zhǎng)度超過(guò)了79字符, 可在函數(shù)定義中輸入左括號(hào)后按回車鍵,并在下一行按兩次Tab鍵,從而將形參列表和只縮進(jìn)一 層的函數(shù)體區(qū)分開(kāi)來(lái)。 大多數(shù)編輯器都會(huì)自動(dòng)對(duì)齊后續(xù)參數(shù)列表行,使其縮進(jìn)程度與你給第一個(gè)參數(shù)列表行指定的 縮進(jìn)程度相同:
def function_name(
parameter_0, parameter_1, parameter_2,
parameter_3, parameter_4, parameter_5):
function body...
如果程序或模塊包含多個(gè)函數(shù),可使用兩個(gè)空行將相鄰的函數(shù)分開(kāi),這樣將更容易知道前一 個(gè)函數(shù)在什么地方結(jié)束,下一個(gè)函數(shù)從什么地方開(kāi)始。 所有的import語(yǔ)句都應(yīng)放在文件開(kāi)頭,唯一例外的情形是,在文件開(kāi)頭使用了注釋來(lái)描述整 個(gè)程序。
8.8 小結(jié)
在本章中,你學(xué)習(xí)了:如何編寫函數(shù),以及如何傳遞實(shí)參,讓函數(shù)能夠訪問(wèn)完成其工作所需 的信息;如何使用位置實(shí)參和關(guān)鍵字實(shí)參,以及如何接受任意數(shù)量的實(shí)參;顯示輸出的函數(shù)和返 回值的函數(shù);如何將函數(shù)同列表、字典、if語(yǔ)句和while循環(huán)結(jié)合起來(lái)使用。你還知道了如何將 函數(shù)存儲(chǔ)在被稱為模塊的獨(dú)立文件中,讓程序文件更簡(jiǎn)單、更易于理解。最后,你學(xué)習(xí)了函數(shù)編 寫指南,遵循這些指南可讓程序始終結(jié)構(gòu)良好,并對(duì)你和其他人來(lái)說(shuō)易于閱讀。
程序員的目標(biāo)之一是,編寫簡(jiǎn)單的代碼來(lái)完成任務(wù),而函數(shù)有助于你實(shí)現(xiàn)這樣的目標(biāo)。它們 讓你編寫好代碼塊并確定其能夠正確運(yùn)行后,就可置之不理。確定函數(shù)能夠正確地完成其工作后, 你就可以接著投身于下一個(gè)編碼任務(wù)。
函數(shù)讓你編寫代碼一次后,想重用它們多少次就重用多少次。需要運(yùn)行函數(shù)中的代碼時(shí),只 需編寫一行函數(shù)調(diào)用代碼,就可讓函數(shù)完成其工作。需要修改函數(shù)的行為時(shí),只需修改一個(gè)代碼 塊,而所做的修改將影響調(diào)用這個(gè)函數(shù)的每個(gè)地方。
使用函數(shù)讓程序更容易閱讀,而良好的函數(shù)名概述了程序各個(gè)部分的作用。相對(duì)于閱讀一系 列的代碼塊,閱讀一系列函數(shù)調(diào)用讓你能夠更快地明白程序的作用。
函數(shù)還讓代碼更容易測(cè)試和調(diào)試。如果程序使用一系列的函數(shù)來(lái)完成其任務(wù),而其中的每個(gè) 函數(shù)都完成一項(xiàng)具體的工作,測(cè)試和維護(hù)起來(lái)將容易得多:你可編寫分別調(diào)用每個(gè)函數(shù)的程序, 并測(cè)試每個(gè)函數(shù)是否在它可能遇到的各種情形下都能正確地運(yùn)行。經(jīng)過(guò)這樣的測(cè)試后你就能信心 滿滿,深信你每次調(diào)用這些函數(shù)時(shí),它們都將正確地運(yùn)行。 在
第9章,你將學(xué)習(xí)編寫類。類將函數(shù)和數(shù)據(jù)整潔地封裝起來(lái),讓你能夠靈活而高效地使用 它們。
第9章
類
9.1 創(chuàng)建和使用類
使用類幾乎可以模擬任何東西。下面來(lái)編寫一個(gè)表示小狗的簡(jiǎn)單類Dog——它表示的不是特 定的小狗,而是任何小狗。對(duì)于大多數(shù)寵物狗,我們都知道些什么呢?它們都有名字和年齡;我 們還知道,大多數(shù)小狗還會(huì)蹲下和打滾。由于大多數(shù)小狗都具備上述兩項(xiàng)信息(名字和年齡)和 兩種行為(蹲下和打滾),我們的Dog類將包含它們。這個(gè)類讓Python知道如何創(chuàng)建表示小狗的對(duì) 象。編寫這個(gè)類后,我們將使用它來(lái)創(chuàng)建表示特定小狗的實(shí)例。
9.1.1 創(chuàng)建 Dog 類
根據(jù)Dog類創(chuàng)建的每個(gè)實(shí)例都將存儲(chǔ)名字和年齡。我們賦予了每條小狗蹲下(sit())和打滾 (roll_over())的能力:
dog.py
1 class Dog():
2 """一次模擬小狗的簡(jiǎn)單嘗試"""
3 def __init__(self, name, age):
"""初始化屬性name和age"""
4 self.name = name
self.age = age
5 def sit(self):
"""模擬小狗被命令時(shí)蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""模擬小狗被命令時(shí)打滾"""
print(self.name.title() + " rolled over!")
這里需要注意的地方很多,但你也不用擔(dān)心,本章充斥著這樣的結(jié)構(gòu),你有大把的機(jī)會(huì)熟悉 它。在1處,我們定義了一個(gè)名為Dog的類。根據(jù)約定,在Python中,首字母大寫的名稱指的是類。 這個(gè)類定義中的括號(hào)是空的,因?yàn)槲覀円獜目瞻讋?chuàng)建這個(gè)類。在2處,我們編寫了一個(gè)文檔字符 串,對(duì)這個(gè)類的功能作了描述。
1. 方法__init__()
類中的函數(shù)稱為方法;你前面學(xué)到的有關(guān)函數(shù)的一切都適用于方法,就目前而言,唯一重要 的差別是調(diào)用方法的方式。3處的方法__init__()是一個(gè)特殊的方法,每當(dāng)你根據(jù)Dog類創(chuàng)建新實(shí) 例時(shí),Python都會(huì)自動(dòng)運(yùn)行它。在這個(gè)方法的名稱中,開(kāi)頭和末尾各有兩個(gè)下劃線,這是一種約 定,旨在避免Python默認(rèn)方法與普通方法發(fā)生名稱沖突。
我們將方法__init__()定義成了包含三個(gè)形參:self、name和age。在這個(gè)方法的定義中,形 參self必不可少,還必須位于其他形參的前面。為何必須在方法定義中包含形參self呢?因?yàn)?Python調(diào)用這個(gè)__init__()方法來(lái)創(chuàng)建Dog實(shí)例時(shí),將自動(dòng)傳入實(shí)參self。每個(gè)與類相關(guān)聯(lián)的方法 調(diào)用都自動(dòng)傳遞實(shí)參self,它是一個(gè)指向?qū)嵗旧淼囊茫寣?shí)例能夠訪問(wèn)類中的屬性和方法。 我們創(chuàng)建Dog實(shí)例時(shí),Python將調(diào)用Dog類的方法__init__()。我們將通過(guò)實(shí)參向Dog()傳遞名字和 年齡;self會(huì)自動(dòng)傳遞,因此我們不需要傳遞它。每當(dāng)我們根據(jù)Dog類創(chuàng)建實(shí)例時(shí),都只需給最 后兩個(gè)形參(name和age)提供值。
4處定義的兩個(gè)變量都有前綴self。以self為前綴的變量都可供類中的所有方法使用,我們 還可以通過(guò)類的任何實(shí)例來(lái)訪問(wèn)這些變量。self.name = name獲取存儲(chǔ)在形參name中的值,并將 其存儲(chǔ)到變量name中,然后該變量被關(guān)聯(lián)到當(dāng)前創(chuàng)建的實(shí)例。self.age = age的作用與此類似。
像這樣可通過(guò)實(shí)例訪問(wèn)的變量稱為屬性。
Dog類還定義了另外兩個(gè)方法:sit()和roll_over()(見(jiàn)5)。由于這些方法不需要額外的信 息,如名字或年齡,因此它們只有一個(gè)形參self。我們后面將創(chuàng)建的實(shí)例能夠訪問(wèn)這些方法,換 句話說(shuō),它們都會(huì)蹲下和打滾。當(dāng)前,sit()和roll_over()所做的有限,它們只是打印一條消息, 指出小狗正蹲下或打滾。但可以擴(kuò)展這些方法以模擬實(shí)際情況:如果這個(gè)類包含在一個(gè)計(jì)算機(jī)游 戲中,這些方法將包含創(chuàng)建小狗蹲下和打滾動(dòng)畫效果的代碼。如果這個(gè)類是用于控制機(jī)器狗的, 這些方法將引導(dǎo)機(jī)器狗做出蹲下和打滾的動(dòng)作。
2. 在Python 2.7中創(chuàng)建類
在Python 2.7中創(chuàng)建類時(shí),需要做細(xì)微的修改——在括號(hào)內(nèi)包含單詞object:
class ClassName(object):
--snip--
這讓Python 2.7類的行為更像Python 3類,從而簡(jiǎn)化了你的工作。 在Python 2.7中定義Dog類時(shí),代碼類似于下面這樣:
class Dog(object):
--snip--
9.1.2 根據(jù)類創(chuàng)建實(shí)例
可將類視為有關(guān)如何創(chuàng)建實(shí)例的說(shuō)明。Dog類是一系列說(shuō)明,讓Python知道如何創(chuàng)建表示特 定小狗的實(shí)例。
下面來(lái)創(chuàng)建一個(gè)表示特定小狗的實(shí)例:
class Dog():
--snip--
1 my_dog = Dog('willie', 6)
2 print("My dog's name is " + my_dog.name.title() + ".")
3 print("My dog is " + str(my_dog.age) + " years old.")
這里使用的是前一個(gè)示例中編寫的Dog類。在1處,我們讓Python創(chuàng)建一條名字為'willie'、 年齡為6的小狗。遇到這行代碼時(shí),Python使用實(shí)參'willie'和6調(diào)用Dog類中的方法__init__()。 方法__init__()創(chuàng)建一個(gè)表示特定小狗的示例,并使用我們提供的值來(lái)設(shè)置屬性name和age。方法 __init__()并未顯式地包含return語(yǔ)句,但Python自動(dòng)返回一個(gè)表示這條小狗的實(shí)例。我們將這 個(gè)實(shí)例存儲(chǔ)在變量my_dog中。在這里,命名約定很有用:我們通??梢哉J(rèn)為首字母大寫的名稱(如 Dog)指的是類,而小寫的名稱(如my_dog)指的是根據(jù)類創(chuàng)建的實(shí)例。
1. 訪問(wèn)屬性
要訪問(wèn)實(shí)例的屬性,可使用句點(diǎn)表示法。在2處,我們編寫了如下代碼來(lái)訪問(wèn)my_dog的屬性name的值:
my_dog.name
句點(diǎn)表示法在Python中很常用,這種語(yǔ)法演示了Python如何獲悉屬性的值。在這里,Python 先找到實(shí)例my_dog,再查找與這個(gè)實(shí)例相關(guān)聯(lián)的屬性name。在Dog類中引用這個(gè)屬性時(shí),使用的 是self.name。在3處,我們使用同樣的方法來(lái)獲取屬性age的值。在前面的第1條print語(yǔ)句中, my_dog.name.title()將my_dog的屬性name的值'willie'改為首字母大寫的;在第2條print語(yǔ)句中, str(my_dog.age)將my_dog的屬性age的值6轉(zhuǎn)換為字符串。 輸出是有關(guān)my_dog的摘要:
My dog's name is Willie.
My dog is 6 years old.
2. 調(diào)用方法
根據(jù)Dog類創(chuàng)建實(shí)例后,就可以使用句點(diǎn)表示法來(lái)調(diào)用Dog類中定義的任何方法。下面來(lái)讓小 狗蹲下和打滾:
class Dog():
--snip--
my_dog = Dog('willie', 6)
my_dog.sit()
my_dog.roll_over()
要調(diào)用方法,可指定實(shí)例的名稱(這里是my_dog)和要調(diào)用的方法,并用句點(diǎn)分隔它們。遇 到代碼my_dog.sit()時(shí),Python在類Dog中查找方法sit()并運(yùn)行其代碼。Python以同樣的方式解讀 代碼my_dog.roll_over()。 Willie按我們的命令做了:
Willie is now sitting.
Willie rolled over!
這種語(yǔ)法很有用。如果給屬性和方法指定了合適的描述性名稱,如name、age、sit()和 roll_over(),即便是從未見(jiàn)過(guò)的代碼塊,我們也能夠輕松地推斷出它是做什么的。
3. 創(chuàng)建多個(gè)實(shí)例
可按需求根據(jù)類創(chuàng)建任意數(shù)量的實(shí)例。下面再創(chuàng)建一個(gè)名為your_dog的實(shí)例
class Dog():
--snip--
my_dog = Dog('willie', 6)
your_dog = Dog('lucy', 3)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
my_dog.sit()
print("\nYour dog's name is " + your_dog.name.title() + ".")
print("Your dog is " + str(your_dog.age) + " years old.")
your_dog.sit()
在這個(gè)實(shí)例中,我們創(chuàng)建了兩條小狗,它們分別名為Willie和Lucy。每條小狗都是一個(gè)獨(dú)立 的實(shí)例,有自己的一組屬性,能夠執(zhí)行相同的操作:
My dog's name is Willie.
My dog is 6 years old.
Willie is now sitting.
Your dog's name is Lucy.
Your dog is 3 years old.
Lucy is now sitting.
就算我們給第二條小狗指定同樣的名字和年齡,Python依然會(huì)根據(jù)Dog類創(chuàng)建另一個(gè)實(shí)例。 你可按需求根據(jù)一個(gè)類創(chuàng)建任意數(shù)量的實(shí)例,條件是將每個(gè)實(shí)例都存儲(chǔ)在不同的變量中,或占用 列表或字典的不同位置。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-765832.html
關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全12-CSDN博客文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-765832.html
往期快速傳送門??(在文章最后):
感謝大家的支持!歡迎訂閱收藏!專欄將持續(xù)更新!
到了這里,關(guān)于關(guān)于“Python”的核心知識(shí)點(diǎn)整理大全19的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!