學(xué)到“類”這一章的時(shí)候剃允,應(yīng)該算是真正接觸面向?qū)ο缶幊塘耍c之前的流程化的完全不一樣了,所以學(xué)得稍顯吃力踱侣,有些沒寫清楚或?qū)戝e(cuò)的請(qǐng)及時(shí)指正粪小。
第九章 類
1.創(chuàng)建和使用類
個(gè)人理解,類就是把現(xiàn)實(shí)中的一些對(duì)象的屬性和功能進(jìn)行抽象抡句。
比如:
把人作為對(duì)象探膊,每個(gè)人都有姓名、年齡待榔、性別逞壁、身高、體重等信息锐锣,
這些可以歸納作為屬性腌闯。
每個(gè)人都會(huì)坐、站雕憔、躺姿骏、走等,
這些可以歸納為方法斤彼。
方法和屬性的區(qū)別分瘦,個(gè)人理解為:
因?yàn)榉椒ú皇且粋€(gè)變量能表示,而是一些行為琉苇,
而屬性是簡(jiǎn)單的信息嘲玫,能夠直接用一段文字或者幾個(gè)數(shù)字表示。
(1)創(chuàng)建類
class 類名():
*:類名通常首字母大寫翁潘。
(2)__init __()方法:類里面的第一個(gè)方法
每當(dāng)利用類創(chuàng)建實(shí)例時(shí)趁冈,這個(gè)方法都會(huì)自動(dòng)運(yùn)行。
def __init__(self,para_1,para_2):
self.para_1 = para_1
self.para_2 = para_2
*:1.init前后均為2個(gè)下劃線拜马!2個(gè)下劃線渗勘!2個(gè)下劃線!
2.第一個(gè)形參代表了這個(gè)類俩莽,可以是self旺坠,也可以是其他名字。
3.代碼塊中的兩句話扮超,相當(dāng)于在類實(shí)例化時(shí)取刃,將傳遞過來的實(shí)參傳給了屬性。
4.以self為前綴的變量可以給類中所有的方法使用出刷。
可以理解為璧疗,以self為前綴的變量就是屬性,屬性可以在類中任何地方使用馁龟。
5.定義其他方法的時(shí)候崩侠,通常都將self作為參數(shù)。相當(dāng)于確保所有方法都能使用屬性坷檩。
(3)根據(jù)類創(chuàng)建實(shí)例
定義了一個(gè)類以后却音,可使用以下語句來創(chuàng)建實(shí)例改抡。也就是根據(jù)類生成對(duì)象。
實(shí)例名 = 類名(實(shí)參)
*:1.實(shí)例的名稱通常使用小寫系瓢,方便地與類名相區(qū)分阿纤;
2.訪問屬性或調(diào)用方法時(shí),使用句點(diǎn)(.)
即: 類名.屬性名 and 類名.方法
小例子
class People():
'''嘗試對(duì)人進(jìn)行簡(jiǎn)單的抽象夷陋。'''
def __init__(self,name,sex,age):
'''初始化姓名欠拾、性別和年齡'''
self.name = name
self.sex = sex
self.age = age
def sit(self):
'''模擬人會(huì)坐下'''
print(self.name.title() + 'is sitting!')
#實(shí)例化一個(gè)人
zhangsan = People('zhangsan','man','18')
#訪問實(shí)例的屬性
print('My name is ' + zhangsan.name)
#調(diào)用實(shí)例的方法
zhangsan.sit()
將上面的代碼存儲(chǔ)為people.py,然后運(yùn)行肌稻,結(jié)果如下:
2.使用類和實(shí)例
(1)給屬性指定默認(rèn)值
這個(gè)可以在定義類的init()方法時(shí)設(shè)置清蚀。
書上說:“類中每個(gè)屬性都必須有初始值,哪怕是0或者空字符串爹谭〖闲埃”(P143)
這句話不是很理解,因?yàn)樗约旱睦右裁从薪o初始值诺凡!
拋開這個(gè)不管东揣,還有一種方法設(shè)置默認(rèn)值!
那就是在init()方法里面直接指定腹泌。
def __init__(self,name,sex,age):
'''初始化姓名嘶卧、性別和年齡'''
self.name = name
self.sex = sex
self.age = age
self.country = 'China'
*:以這種方法指定默認(rèn)值時(shí),定義init()時(shí)不需要包含country這個(gè)形參凉袱。
并且芥吟,實(shí)例化的時(shí)候,不需要也不允許傳遞這個(gè)參數(shù)专甩。否則會(huì)報(bào)錯(cuò)钟鸵。
(2)修改屬性的值
總共兩種方法:
1.直接修改屬性的值
(接上例)
實(shí)例化:zhangsan = People('zhangsan','man','18')
直接修改:zhangsan.sex = 'woman'
2.通過方法修改
需要在類里面定義一個(gè)修改屬性的方法,然后調(diào)用它來修改屬性涤躲。
*:當(dāng)屬性的默認(rèn)值時(shí)在init()方法里面直接指定時(shí)棺耍,只能這樣修改屬性。
(接上例)
在People類中定義一個(gè)change_country()的方法:
def change_country(self,new_country):
self.country = new_country
*:注意這個(gè)self不能少种樱!這個(gè)self不能少蒙袍!這個(gè)self不能少!
實(shí)例化:zhangsan = People('zhangsan','man','18')
通過方法修改屬性:zhangsan.change_country('USA')
3.繼承
1.子類會(huì)繼承父類的所有屬性和方法嫩挤,且還可以自己定義新的害幅。
2.創(chuàng)建子類時(shí),父類必須包含在當(dāng)前的文件中岂昭,且位于子類的前面矫限。
(在后面用到了導(dǎo)入以后,應(yīng)該可以不需要這樣了,只需先導(dǎo)入父類)
3.定義子類時(shí)叼风,要用到父類的名字:class 子類名(父類名):
(1)子類的init()方法
子類的init()方法需要先初始化父類的屬性,通過下面的語句來實(shí)現(xiàn):
def __init__(self,name,sex,age)
"""初始化父類的屬性"""
super().__init__(name,sex,age)
*:super()是一個(gè)特殊函數(shù)棍苹,實(shí)現(xiàn)將父類和子類關(guān)聯(lián)起來无宿。
(2)給子類定義屬性和方法
這個(gè)與類的定義時(shí)一樣的
(3)重寫父類的方法
很簡(jiǎn)單,定義一個(gè)方法枢里,名字與父類中的方法名一樣就行孽鸡。
(4)將實(shí)例用作屬性:也就是在一個(gè)類中調(diào)用另一個(gè)類的實(shí)例作為屬性
這個(gè)實(shí)現(xiàn)了將大型的類拆為很多個(gè)小類。
下面看一個(gè)小栗子栏豺,將上面講到的繼承相關(guān)的串一下:
class People():
'''嘗試對(duì)人進(jìn)行簡(jiǎn)單的抽象彬碱。'''
def __init__(self,name,sex,age):
'''初始化姓名、性別和年齡'''
self.name = name
self.sex = sex
self.age = age
self.country = 'China'
def sit(self):
'''模擬人會(huì)坐下'''
print(self.name.title() + ' is sitting!')
def change_country(self,new_country):
self.country = new_country
class Bodysize():
'''定義一個(gè)身體數(shù)據(jù)類奥洼,等下實(shí)現(xiàn)將實(shí)例作為屬性巷疼。'''
def __init__(self,height,weight ):
self.height = height
self.weight = weight
def body_data(self):
print("I'm " + self.height + "cm tall and "+
self.weight + "kg weight.")
class Teacher(People):
'''定義一個(gè)老師類,繼承了人這個(gè)類'''
def __init__(self,name,sex,age):
'''初始化人類的屬性'''
super().__init__(name,sex,age)
#定義一個(gè)子類的屬性
self.subject = 'Physics'
self.size = Bodysize('175','70')
#定義一個(gè)子類的方法
def simple_introduction(self):
print("I'm a " + self.subject + " Teacher!")
#重寫一個(gè)父類的方法
def sit(self):
print(self.subject + " Teacher is sitting!")
#實(shí)例化一個(gè)老師對(duì)象
lisi = Teacher('lisi','man','28')
#調(diào)用子類中新定義的方法
lisi.simple_introduction()
#調(diào)用Bodysize實(shí)例的方法
lisi.size.body_data()
#調(diào)用子類中重寫的父類的方法
lisi.sit()
運(yùn)行結(jié)果:
4.導(dǎo)入類
將類存儲(chǔ)在模塊中灵奖,然后在主程序中導(dǎo)入嚼沿,可以使文件更加簡(jiǎn)潔和清晰。
導(dǎo)入模塊/函數(shù)的幾種方法(與上一章的導(dǎo)入函數(shù)類似):
1.直接導(dǎo)入整個(gè)模塊
import 模塊名
**:調(diào)用時(shí)瓷患,需要使用句點(diǎn)(.)指定模塊和類骡尽。
即:模塊名.類名()
2.導(dǎo)入模塊中的特定類
from 模塊名 import 類名
**:使用這種方法時(shí),實(shí)例化指定的類時(shí)擅编,不需要使用句點(diǎn)(.)指定模塊攀细,
可以直接用類名來實(shí)例化。
3.導(dǎo)入模塊中的多個(gè)特定類
from 模塊名 import 類名1爱态,類名2
**:也就是用逗號(hào)(,)實(shí)現(xiàn)多個(gè)類同時(shí)導(dǎo)入谭贪。
4.導(dǎo)入模塊中所有的類
from 模塊名 import *
**:使用這種方法時(shí),調(diào)用該模塊中的所有類都不需要使用句點(diǎn)(.)指定模塊名肢藐。
這種方法不推薦故河,理由和導(dǎo)入函數(shù)一樣的,這種方法都是不推薦的吆豹。
5.在一個(gè)模塊中導(dǎo)入另一個(gè)模塊
這個(gè)沒什么特別的鱼的。需要啥就導(dǎo)入啥。
5.Python標(biāo)準(zhǔn)庫(kù)
這一節(jié)實(shí)際上沒說什么痘煤,就是告訴你:
Python標(biāo)準(zhǔn)庫(kù)實(shí)際上就是一組模塊凑阶,里面有很多類和函數(shù)。
6.類編碼風(fēng)格
這個(gè)又是告訴你很多“龜腚”衷快,但是宙橱,這些龜腚是有用的!
熟悉編碼風(fēng)格,養(yǎng)成良好的習(xí)慣师郑,
一來可以讓你的代碼更清晰环葵,二來也方便別人閱讀指點(diǎn)。
1.類名中的每個(gè)單詞的首字母都要大寫宝冕,而且不用下劃線张遭;
2.實(shí)例名和模塊名都使用小寫,用下劃線分隔單詞地梨;
3.類和模塊的定義后面寫一個(gè)文檔字符串(跟函數(shù)一樣的)菊卷;
4.合理使用空行,但不要濫用:
模塊里面的不同類之間宝剖,用2個(gè)空行洁闰;
類里面的不同方法之間使用一個(gè)空行;
5.需要同時(shí)導(dǎo)入標(biāo)準(zhǔn)庫(kù)中的模塊和自己寫的模塊時(shí)万细,
先導(dǎo)入標(biāo)準(zhǔn)庫(kù)的扑眉,
然后加一個(gè)空行,
再導(dǎo)入自己寫的模塊雅镊。
-->這樣的好處是讓別人知道你的模塊都來自那些地方襟雷。
這一章寫的很困難,不過梳理一下仁烹,自己是可以搞清楚多了耸弄!
如果哪里有錯(cuò)漏,請(qǐng)不吝賜教卓缰!