性少妇vide0seⅹfree_国产剧情视频在线观看_日日碰夜夜爽_九九这里只有精品视频_性free毛茸茸偷窥videos_国产v亚洲

中培偉業(yè)IT資訊頻道
您現(xiàn)在的位置:首頁(yè) > IT資訊 > 精選文章 > 學(xué)習(xí)Python語(yǔ)言的核心

學(xué)習(xí)Python語(yǔ)言的核心

2021-07-01 15:04:14 | 來(lái)源:中培企業(yè)IT培訓(xùn)網(wǎng)

python語(yǔ)言的核心內(nèi)容與類(lèi)與對(duì)象有關(guān)。類(lèi)與對(duì)象各自的內(nèi)容也有著不同。類(lèi)是用來(lái)描述具有相同屬性和方法對(duì)象的集合。而對(duì)象又是類(lèi)里面一個(gè)具體的東西。那么這樣講起來(lái)是不就是就沒(méi)有那么難以理解了。類(lèi)方法與類(lèi)對(duì)象的內(nèi)容也需要我們多多了解。

幫你理解Python面向?qū)ο蟮木幊痰幕靖拍詈秃诵乃枷搿1疚膬?nèi)含很多實(shí)例代碼,以幫助新手更好理解。如果你在學(xué)習(xí)基于Python的Django Web開(kāi)發(fā)框架,因?yàn)镈jango編程就是采用面向?qū)ο蟮木幊獭?/p>

類(lèi)(Class)與對(duì)象(Object)

類(lèi)(Class)是用來(lái)描述具有相同屬性(Attribute)和方法(Method)對(duì)象的集合。對(duì)象(Object)是類(lèi)(Class)的具體實(shí)例。比如學(xué)生都有名字和分?jǐn)?shù),他們有著共同的屬性。這時(shí)我們就可以設(shè)計(jì)一個(gè)學(xué)生類(lèi), 用于記錄學(xué)生的名字和分?jǐn)?shù),并自定義方法打印出他們的名字和方法。屬性(Attribute): 類(lèi)里面用于描述所有對(duì)象共同特征的變量或數(shù)據(jù)。比如學(xué)生的名字和分?jǐn)?shù)。

方法(Method): 類(lèi)里面的函數(shù),用來(lái)區(qū)別類(lèi)外面的函數(shù), 用來(lái)實(shí)現(xiàn)某些功能。比如打印出學(xué)生的名字和分?jǐn)?shù)。

要?jiǎng)?chuàng)建一個(gè)類(lèi)我們需要使用關(guān)鍵詞class. 這個(gè)學(xué)生類(lèi)Student看上去應(yīng)該是這樣的:# 創(chuàng)建一個(gè)學(xué)生類(lèi)classStudent:        # 定義學(xué)生屬性,初始化方法def__init__(self,name,score):        self.name = name        self.score = score    # 定義打印學(xué)生信息的方法defshow(self):        print("Name: {}. Score: {}".format(self.name,self.score))

在這個(gè)案例中,我們只定義了一個(gè)抽象的類(lèi),電腦并沒(méi)有創(chuàng)建什么存儲(chǔ)空間。只有當(dāng)我們完成類(lèi)的實(shí)例化(Instance)時(shí),電腦才會(huì)創(chuàng)建一個(gè)具體的對(duì)象(Object),并為之分配存儲(chǔ)空間。所以對(duì)象(Object)是類(lèi)(Class)的一個(gè)實(shí)例。

要?jiǎng)?chuàng)建一個(gè)具體的學(xué)生對(duì)象(Object),我們還需要輸入:student1 = Student("John",100)student2 = Student("Lucy",99)

在這個(gè)案例中,Student是類(lèi),student1和student2是我們創(chuàng)建的具體的學(xué)生對(duì)象。當(dāng)我們輸入上述代碼時(shí),Python會(huì)自動(dòng)調(diào)用默認(rèn)的__init__初始構(gòu)造函數(shù)來(lái)生成具體的對(duì)象。關(guān)鍵字self是個(gè)非常重要的參數(shù),代表創(chuàng)建的對(duì)象本身。

當(dāng)你創(chuàng)建具體的對(duì)象后,你可以直接通過(guò)student1.name和student1.score來(lái)分別獲取學(xué)生的名字和分?jǐn)?shù),也可以通過(guò)student1.show()來(lái)直接打印學(xué)生的名字和分?jǐn)?shù)。

類(lèi)變量(class variables)與實(shí)例變量(instance variables)

假設(shè)我們需要在Student類(lèi)里增加一個(gè)計(jì)數(shù)器number,每當(dāng)一個(gè)新的學(xué)生對(duì)象(Object)被創(chuàng)建時(shí),這個(gè)計(jì)數(shù)器就自動(dòng)加1.由于這個(gè)計(jì)數(shù)器不屬于某個(gè)具體學(xué)生,而屬于Student類(lèi)的,所以被稱(chēng)為類(lèi)變量(class variables)。而姓名和分?jǐn)?shù)屬于每個(gè)學(xué)生對(duì)象的,所以屬于實(shí)例變量(instance variables),也被稱(chēng)為對(duì)象變量(object variables)。

這個(gè)新Student類(lèi)看上去應(yīng)該是這樣的:# 創(chuàng)建一個(gè)學(xué)生類(lèi)classStudent:    # number屬于類(lèi)變量,定義在方法外,不屬于具體實(shí)例number = 0# 定義學(xué)生屬性,初始化方法    # name和score屬于實(shí)例變量,定義在方法里def__init__(self,name,score):        self.name = name        self.score = score        # 此處有錯(cuò)誤        number= number + 1# 定義打印學(xué)生信息的方法defshow(self):        print("Name: {}. Score: {}".format(self.name,self.score))

類(lèi)變量和實(shí)例變量的區(qū)別很大,訪問(wèn)方式也也不一樣。類(lèi)變量:類(lèi)變量在整個(gè)實(shí)例化的對(duì)象中是公用的。類(lèi)變量定義在類(lèi)中且在函數(shù)體之外。訪問(wèn)或調(diào)用類(lèi)變量的正確方式是類(lèi)名.變量名或者self.__class__.變量名。self.__class__自動(dòng)返回每個(gè)對(duì)象的類(lèi)名。

實(shí)例變量:定義在方法中的變量,屬于某個(gè)具體的對(duì)象。訪問(wèn)或調(diào)用實(shí)例變量的正確方式是對(duì)象名.變量名或者self.變量名.

注意到上述Student類(lèi)有個(gè)錯(cuò)誤沒(méi)? 我們?cè)噲D直接使用number = number + 1調(diào)用屬于類(lèi)的變量number。正確的方式是使用Student.number或self.__class__.number訪問(wèn)屬于類(lèi)的變量。下面的代碼才是正確的:# 創(chuàng)建一個(gè)學(xué)生類(lèi)classStudent:    # number屬于類(lèi)變量,不屬于某個(gè)具體的學(xué)生實(shí)例number = 0# 定義學(xué)生屬性,初始化方法    # name和score屬于實(shí)例變量def__init__(self,name,score):        self.name = name        self.score = scoreStudent.number = Student.number + 1# 定義打印學(xué)生信息的方法defshow(self):        print("Name: {}. Score: {}".format(self.name,self.score))# 實(shí)例化,創(chuàng)建對(duì)象student1 = Student("John",100)student2 = Student("Lucy",99)print(Student.number)  # 打印2print(student1.__class__.number) # 打印2

類(lèi)方法(Class method)

正如同有些變量只屬于類(lèi),有些方法也只屬于類(lèi),不屬于具體的對(duì)象。你有沒(méi)有注意到屬于對(duì)象的方法里面都有一個(gè)self參數(shù), 比如__init__(self), show(self)?self是指對(duì)象本身。屬于類(lèi)的方法不使用self參數(shù), 而使用參數(shù)cls,代表類(lèi)本身。另外習(xí)慣上對(duì)類(lèi)方法我們會(huì)加上@classmethod的修飾符做說(shuō)明。

同樣拿Student為例子,我們不用print函數(shù)打印出已創(chuàng)建學(xué)生對(duì)象的數(shù)量,而是自定義一個(gè)類(lèi)方法來(lái)打印,我們可以這么做:classStudent:    # number屬于類(lèi)變量,不屬于某個(gè)具體的學(xué)生實(shí)例number = 0# 定義學(xué)生屬性,初始化方法    # name和score屬于實(shí)例變量def__init__(self,name,score):        self.name = name        self.score = score        Student.number = Student.number + 1# 定義打印學(xué)生信息的方法defshow(self):        print("Name: {}. Score: {}".format(self.name,self.score))    # 定義類(lèi)方法,打印學(xué)生的數(shù)量@classmethoddeftotal(cls):        print("Total: {0}".format(cls.number))# 實(shí)例化,創(chuàng)建對(duì)象student1 = Student("John",100)student2 = Student("Lucy",99)Student.total()  # 打印 Total: 2

類(lèi)的私有屬性(private attribute)和私有方法(private method)

類(lèi)里面的私有屬性和私有方法以雙下劃線__開(kāi)頭。私有屬性或方法不能在類(lèi)的外部被使用或直接訪問(wèn)。我們同樣看看學(xué)生類(lèi)這個(gè)例子,把分?jǐn)?shù)score變?yōu)樗接袑傩裕纯磿?huì)發(fā)生什么。# 創(chuàng)建一個(gè)學(xué)生類(lèi)classStudent:    # 定義學(xué)生屬性,初始化方法    # name和score屬于實(shí)例變量, 其中__score屬于私有變量def__init__(self,name,score):        self.name = name        self.__score = score    # 定義打印學(xué)生信息的方法defshow(self):        print("Name: {}. Score: {}".format(self.name,self.__score))# 實(shí)例化,創(chuàng)建對(duì)象student1 = Student("John",100)student1.show()  # 打印 Name: John, Score: 100student1.__score  # 打印出錯(cuò),該屬性不能從外部訪問(wèn)。

如果你將score變成__score, 你將不能直接通過(guò)student1.__score獲取該學(xué)生的分?jǐn)?shù)。show()可以正常顯示分?jǐn)?shù),是因?yàn)樗穷?lèi)里面的函數(shù),可以訪問(wèn)私有變量。

私有方法是同樣的道理。當(dāng)我們把show()變成,__show()你將不能再通過(guò)student1.__show()打印出學(xué)生的名字和分?jǐn)?shù)。值得注意的是私有方法必需含有self這個(gè)參數(shù),且把它作為第一個(gè)參數(shù)。

在面向?qū)ο蟮木幊讨?通常情況下很少讓外部類(lèi)直接訪問(wèn)類(lèi)內(nèi)部的屬性和方法,而是向外部類(lèi)提供一些按鈕,對(duì)其內(nèi)部的成員進(jìn)行訪問(wèn),以保證程序的安全性,這就是封裝。

@property的用法與神奇之處

在上述案例中用戶(hù)不能用student1.__score方式訪問(wèn)學(xué)生分?jǐn)?shù),然而用戶(hù)也就知道了__score是個(gè)私有變量。我們有沒(méi)有一種方法讓用戶(hù)通過(guò)student1.score來(lái)訪問(wèn)學(xué)生分?jǐn)?shù)而繼續(xù)保持__score私有變量的屬性呢?這時(shí)我們就可以借助python的@property裝飾器了。我們可以先定義一個(gè)方法score(), 然后利用@property把這個(gè)函數(shù)偽裝成屬性。見(jiàn)下面例子:# 創(chuàng)建一個(gè)學(xué)生類(lèi)classStudent:    # 定義學(xué)生屬性,初始化方法    # name和score屬于實(shí)例變量, 其中score屬于私有變量def__init__(self,name,score):        self.name = name        self.__score = score    # 利用property裝飾器把函數(shù)偽裝成屬性@propertydefscore(self):        print("Name: {}. Score: {}".format(self.name,self.__score))# 實(shí)例化,創(chuàng)建對(duì)象student1 = Student("John",100)student1.score  # 打印 Name: John. Score: 100

注意:一旦給函數(shù)加上一個(gè)裝飾器@property,調(diào)用函數(shù)的時(shí)候不用加括號(hào)就可以直接調(diào)用函數(shù)了

類(lèi)的繼承(Inheritance)

面向?qū)ο蟮木幊處?lái)的最大好處之一就是代碼的重用,實(shí)現(xiàn)這種重用的方法之一是通過(guò)繼承(Inheritance)。你可以先定義一個(gè)基類(lèi)(Base class)或父類(lèi)(Parent class),再按通過(guò)class 子類(lèi)名(父類(lèi)名)來(lái)創(chuàng)建子類(lèi)(Child class)。這樣子類(lèi)就可以從父類(lèi)那里獲得其已有的屬性與方法,這種現(xiàn)象叫做類(lèi)的繼承。

我們?cè)倏戳硪粋€(gè)例子,老師和學(xué)生同屬學(xué)校成員,都有姓名和年齡的屬性,然而老師有工資這個(gè)專(zhuān)有屬性,學(xué)生有分?jǐn)?shù)這個(gè)專(zhuān)有屬性。這時(shí)我們就可以定義1一個(gè)學(xué)校成員父類(lèi),2個(gè)子類(lèi)。# 創(chuàng)建父類(lèi)學(xué)校成員SchoolMemberclassSchoolMember:    def__init__(self,name,age):        self.name = name        self.age = age    deftell(self):        # 打印個(gè)人信息print('Name:"{}" Age:"{}"'.format(self.name,self.age),end=" ")# 創(chuàng)建子類(lèi)老師 TeacherclassTeacher(SchoolMember):    def__init__(self,name,age,salary):        SchoolMember.__init__(self,name,age) # 利用父類(lèi)進(jìn)行初始化self.salary = salary    # 方法重寫(xiě)deftell(self):        SchoolMember.tell(self)        print('Salary: {}'.format(self.salary))# 創(chuàng)建子類(lèi)學(xué)生StudentclassStudent(SchoolMember):    def__init__(self,name,age,score):        SchoolMember.__init__(self,name,age)        self.score = score    deftell(self):        SchoolMember.tell(self)        print('score: {}'.format(self.score))teacher1 = Teacher("John",44."$60000")student1 = Student("Mary",12.99)teacher1.tell()  # 打印 Name:"John" Age:"44" Salary: $60000student1.tell()  # Name:"Mary" Age:"12" score: 99

上述代碼中,你注意到以下幾點(diǎn)了嗎?在創(chuàng)建子類(lèi)的過(guò)程中,你需要手動(dòng)調(diào)用父類(lèi)的構(gòu)造函數(shù)__init__來(lái)完成子類(lèi)的構(gòu)造。

在子類(lèi)中調(diào)用父類(lèi)的方法時(shí),需要加上父類(lèi)的類(lèi)名前綴,且需要帶上self參數(shù)變量。比如SchoolMember.tell(self), 這個(gè)可以通過(guò)使用super關(guān)鍵詞簡(jiǎn)化代碼。

如果子類(lèi)調(diào)用了某個(gè)方法(如tell())或?qū)傩裕琍ython會(huì)先在子類(lèi)中找,如果找到了會(huì)直接調(diào)用。如果找不到才會(huì)去父類(lèi)找。這為方法重寫(xiě)帶來(lái)了便利。

實(shí)際Python編程過(guò)程中,一個(gè)子類(lèi)可以繼承多個(gè)父類(lèi),原理是一樣的。第一步總是要手動(dòng)調(diào)用__init__構(gòu)造函數(shù)。

super()關(guān)鍵字調(diào)用父類(lèi)方法

在子類(lèi)當(dāng)中可以通過(guò)使用super關(guān)鍵字來(lái)直接調(diào)用父類(lèi)的中相應(yīng)的方法,簡(jiǎn)化代碼。在下面例子中,學(xué)生子類(lèi)調(diào)用了父類(lèi)的tell()方法。super().tell()等同于SchoolMember.tell(self)。當(dāng)你使用Python super()關(guān)鍵字調(diào)用父類(lèi)方法時(shí)時(shí),注意去掉括號(hào)里self這個(gè)參數(shù)。# 創(chuàng)建子類(lèi)學(xué)生StudentclassStudent(SchoolMember):    def__init__(self,name,age,score):        SchoolMember.__init__(self,name,age)        self.score = score    deftell(self):        super().tell() # 等同于 SchoolMember.tell(self)print('score: {}'.format(self.score))

通過(guò)一些舉例來(lái)介紹這些具體內(nèi)容理解起來(lái)就不會(huì)那么空洞。在現(xiàn)有的學(xué)識(shí)上,我們還需要不斷進(jìn)步才能趕上時(shí)代發(fā)展的步伐。Python語(yǔ)言的學(xué)習(xí)是需要不斷提煉的一個(gè)過(guò)程。因此,掌握好學(xué)習(xí)方法的同時(shí)還需要自己去領(lǐng)悟一些書(shū)本里面學(xué)不到的東西。想要了解Python語(yǔ)言的更多信息,請(qǐng)繼續(xù)關(guān)注中培偉業(yè)。

標(biāo)簽: pytthon的核心

相關(guān)閱讀

主站蜘蛛池模板: 欧美天天综合网 | av基地网| 999精品无码a片在线1级 | 国产片久久久 | 色乱码一区二区三区网站 | 日本在线无 | а√天堂8资源中文在线 | CAOPROM国产在线视频 | 四虎永久免费网站 | 亚洲无遮挡av | 一区二区三区二区中文字幕视频 | 日产精品久久久久久久性色91 | chinese刺激sex喷水 | 欧美一区一区 | 亚洲精品乱 | 种付おじさんと在线观看 | 操操网址| 日本一区中文字幕在线观看 | 国产精品国产三级国产普通话对白 | 四虎库影必出精品8848 | 色综合视频一区中文字幕 | 蜜桃视频一区二区三区在线观看 | 亚洲国产婷婷六月丁香 | 亚洲涩涩在线 | 国产激情久久久久影院小草 | 国产精品久久久久久电影 | 日韩中文第一页 | 国产美女视频黄a片免费观看软件 | 国产精品久久久av | 欧美第一黄色网 | 97色mm五月天亚洲 | va婷婷| 精久久久 | 天堂乱码一二三区 | 国产欧美呀洲一区二区 | 一二三四在线观看高清观看 | 韩日av一区二区三区 | 亚洲美免无码中文字幕 | 97超碰青青草 | 中文字幕免费在线看 | 黄色一极片 |