2020-07-22 Python學習筆記25 類和面向?qū)ο缶幊?/h1>

一些關(guān)于自己學習Python的經(jīng)歷的內(nèi)容购撼,遇到的問題和思考等媒佣,方便以后查詢和復習匕累。

聲明:本人學習是在扇貝編程通過網(wǎng)絡(luò)學習的,相關(guān)的知識默伍、案例來源于扇貝編程欢嘿。如果使用請說明來源。

練習:類的創(chuàng)建和調(diào)用

我們接著用上一節(jié)中創(chuàng)建的類來進行實例化也糊,并調(diào)用其中的屬性和方法炼蹦。

要求:

實例化 Bird 類;

訪問屬性 wings 并打印出 我有 2 只翅膀狸剃;

調(diào)用方法 fly()掐隐。

class Bird:

? wings = 2

? def fly(self):

? ? print('我會飛')

bird = Bird()

print('我有' + str(bird.wings) +'只翅膀')

bird.fly()

我們來給之前的 Bird 類添加一個 intro 方法。

要求:

添加一個名為 intro 的方法钞馁;

intro() 方法里先訪問 wings 屬性打印出 我有 2 只翅膀虑省,再調(diào)用 fly() 方法打印出 我會飛。

class Bird:

? wings = 2

? def fly(self):

? ? print('我會飛')

? def intro(self):

print('我有%d只翅膀%s' % (self.wings))?

#后面要調(diào)用僧凰,前面要定義慷妙,最初我把這些放在了fly的print里面了。

? ? self.fly()

bird = Bird()

bird.intro()? #這里實例化之后調(diào)用intro允悦,所以前面要先定義膝擂。

這樣是正確的。

但是如果下面這樣

class Bird:

? wings = 2

? def fly(self):

? ? print('我會飛')

? def intro(self):

? ? print('我有%d只翅膀%s' % (self.wings, self.fly()))

bird = Bird()

bird.intro()

就會報錯:

我會飛

我有2只翅膀None

我會飛隙弛,打在上一行了

而且第二行沒有打出我會飛架馋,而是返回一個none

原因是使用self.fly()調(diào)用前面定義的的fly這個方法的時候,直接的就打出來我會飛全闷,所以我會飛出現(xiàn)在第一行中

而在intro中使用self.fly()叉寂,它沒有任何數(shù)據(jù),原因就是前面的print打印之后不返回任何信息总珠。所以只打出一個none

把前面的fly方法中屏鳍,print改成return勘纯,之后,能打出符合要求的結(jié)果钓瞭,但是不知道這樣對不對驳遵,是不是符合方法的定義和要求。

class Bird:

? wings = 2

? def fly(self):

? ? return('我會飛')? #這樣符不符合方法的定義和要求呢山涡?

? def intro(self):

? ? print('我有%d只翅膀%s' % (self.wings, self.fly()))


bird = Bird()

bird.intro()

結(jié)果符合要求:

我有2只翅膀

我會飛

但是:把下面這句中的%改成format又出現(xiàn)問題

? ? print('我有%d只翅膀%s'.format (self.wings, self.fly()))

我有%d只翅膀%s

為什么占位符沒有換掉相應(yīng)的數(shù)據(jù)呢堤结?

改一下占位符,就可以了

? print('我有{}只翅膀{}'.format(self.wings, self.fly()))

需要復習一下%和.format的差別鸭丛,這兩個都是個格式化竞穷,我記得是對等的。

把前面方法中的return改回print之后鳞溉,self.fly放在下一個行瘾带,單獨調(diào)用:

print('我有{}只翅膀'.format(self.wings))

self.fly()

或者是:

def fly(self):

? ? print('我會飛')

? def intro(self):

? ? print('我有%s只翅膀'%(self.wings))

self.fly()

練習:賽亞人kakarotto

賽亞人(Saiyan) 是日本動漫《七龍珠》中的一個種族的名稱。他們來自貝吉塔行星熟菲,賽亞人是戰(zhàn)斗民族月弛,天生好戰(zhàn),性格暴躁科盛。賽亞人在月圓之夜看到月亮會變成巨猿,變身后是常態(tài)的 10 倍左右菜皂,并會失去理智贞绵。

《七龍珠》的主角孫悟空(本名卡卡羅特)就是被傳送到地球的賽亞人,接下來我們創(chuàng)建一個賽亞人類恍飘,然后實例化一個卡卡羅特(kakarotto)榨崩。

要求:

定義一個名為 Saiyan(賽亞人)的類;

給 Saiyan 類添加 born_place(出身地)屬性章母,值為 貝吉塔行星母蛛;

給 Saiyan 類添加 character(性格) 屬性,值為 天生好戰(zhàn)性格暴躁乳怎;

給 Saiyan 類添加 transform()(變身)方法彩郊, 作用是打印 變身巨猿;

實例化 Saiyan 類并調(diào)用其中的方法或?qū)傩浴?/p>

class Saiyan:

? born_place = '貝吉塔行星'

? character = '天生好戰(zhàn)性格暴躁'

def transform(self):

? print('變身巨猿')


saiyan = Saiyan()

print('賽亞人來自%s蚪缀,并且%s秫逝。'%(saiyan.born_place, saiyan.character))

賽亞人來自貝吉塔行星,并且天生好戰(zhàn)性格暴躁询枚。

題目要求實例化為卡卡羅特违帆。

class Saiyan:

? born_place = '貝吉塔行星'

? character = '天生好戰(zhàn)性格暴躁'

def transform(self):

? print('變身巨猿')


kakarotto = Saiyan()

print('kakarotto是賽亞人來自%s,并且%s金蜀。'%(kakarotto.born_place, kakarotto.character))

加上intro刷后,這個應(yīng)該是自我介紹單詞的簡寫的畴,用來增加可讀性,介紹人物或事物尝胆。用其他字母或字母組合也可以丧裁,比如都換成a,這里是為了增加可讀性

class Saiyan:? # 定義類的時候班巩,前面的class不用首字母大寫渣慕。類名稱要首字母大寫

? born_place = '貝吉塔行星'

? character = '天生好戰(zhàn)性格暴躁'

? def transform(self):

? ? return('變身巨猿')

? def intro(self):

? ? print('kakarotto是賽亞人來自%s,并且%s抱慌。'%(self.born_place, self.character))

print('他在月圓之夜看見月亮會%s' %self.transform())?

#前面用return逊桦,這里可以打出來,如果前面用print抑进,前面會打一遍强经,這里結(jié)果是none

self.transform()?

#這里是調(diào)用前面的方法,如果前面用的是return這里沒有內(nèi)容寺渗,前面用print匿情,這里才有內(nèi)容

kakarotto = Saiyan()

kakarotto.intro()

學習筆記

類與實例

編程與生活是相通的,我們生活中把事物按 類 劃分信殊,比如人類炬称、狗類、動物類涡拘、植物類等玲躯。在編程世界里,同樣也分了很多 類鳄乏,比如字符串跷车、整數(shù)、浮點數(shù)等

在 Python 中 類 是無數(shù)個相似個體的集合橱野,其中的每個個體叫做 實例朽缴。

類的創(chuàng)建

我們以人類來舉例,人類都有哪些共同點呢水援?兩條胳膊密强、兩條腿、直立行走蜗元、有著各種顏色的頭發(fā)誓斥、說著各式各樣的語言等。這些共同點分為兩類:

特征:兩條胳膊许帐、兩條腿劳坑、有著各種顏色的頭發(fā)? #屬性

行為:直立行走、說著各式各樣的語言? #方法

在 Python 的類中成畦,我們把這種特征和行為分別稱為 屬性(attribute)和 方法(method)【喾遥現(xiàn)實生活中的“類”是我們歸納總結(jié)出來的涝开,而 Python 中的類需要我們自行創(chuàng)建。接下來我們看看如何創(chuàng)建一個類框仔。

定義時舀武,class不用大寫首字母,類的名稱要首字母大寫离斩,后面還要有英文冒號

其下內(nèi)容都要縮進兩個空格

特征直接賦值银舱,值可以直接是數(shù)值,也可以是字符串

方法用def定義跛梗,和定義函數(shù)類似寻馏,第一個參數(shù)一定是self。方法的執(zhí)行過程用print核偿,不知道能不能用return诚欠。

類的 屬性 的創(chuàng)建和變量的定義是一樣的,類的 方法 的創(chuàng)建和函數(shù)的定義也很類似漾岳。唯一不同的是:類的 方法 中有個必須放在首位的參數(shù) self轰绵,它表示創(chuàng)建的實例本身。

除此之外尼荆,按照命名規(guī)范左腔,類名的首字母要大寫,以便我們可以輕松地辨認出這是個類捅儒。

類的調(diào)用

我們剛才只是創(chuàng)建了類液样,接下來我們看看怎么使用創(chuàng)建好的 屬性 和 方法!

class Human:

? arms = 2

? legs = 2

? hair = '各種顏色的頭發(fā)'

? def walk(self):

? ? print('直立行走')

? def speak(self):

? ? print('說著各式各樣的語言')

# 類的實例化

human = Human()

print(human.arms)

# 輸出:2

print(human.legs)

# 輸出:2

print(human.hair)

# 輸出:各種顏色的頭發(fā)

human.walk()

# 輸出:直立行走

human.speak()

# 輸出:說著各式各樣的語言

human = Human() 這一行代碼非常關(guān)鍵野芒,通過該類創(chuàng)建了一個類的實例對象,這個過程叫做 類的實例化双炕。

print(human)

# 輸出:<__main__.Human object>

print(type(human))

# 輸出:<class '__main__.Human'>

<__main__.Human object> 表明這是一個 Human 類的實例對象(object)狞悲,<class '__main__.Human'> 表明它屬于 Human 這個類。

當我們實例化后得到實例 human 后妇斤,實例 human 就擁有了 Human 類的所有 屬性 和 方法摇锋。然后我們通過 實例名.屬性名 和 實例名.方法名 去調(diào)用它們。

為什么調(diào)用方法時不用傳參數(shù)呢站超?定義方法的時候不是有個參數(shù) self 嗎荸恕?這其實是 self 的特殊之處:定義方法的時候必須有,調(diào)用方法的時候要忽略死相。

我們總結(jié)一下進行類的調(diào)用的步驟:

創(chuàng)建一個類融求; class Human:? 定義的時候,類名稱后面沒有括號和參數(shù)

進行類的實例化算撮; human = Human() 實例化時類后面要加上括號生宛,前面用其他字母也可

通過類的實例調(diào)用類的屬性和方法县昂。 human.legs,human.walk() 調(diào)用是前要加上實例名陷舅,但是方法名后面只有括號倒彰,里面沒有參數(shù)。

練習:創(chuàng)建類和調(diào)用

我們接著用上一節(jié)中創(chuàng)建的類來進行實例化莱睁,并調(diào)用其中的屬性和方法待讳。

要求:

實例化 Bird 類;

訪問屬性 wings 并打印出 我有 2 只翅膀仰剿;

調(diào)用方法 fly()创淡。

class Bird:

? wings = 2

? def fly(self):

? ? print('我會飛')

bird = Bird()

print('我有' + str(bird.wings) +'只翅膀')

bird.fly()

答案中結(jié)果的輸出是用格式化,直接用實例名+特征名調(diào)用酥馍。

self 的作用

self 在英文中是“自己辩昆、自我”的意思,在 Python 的類中旨袒,self 表示創(chuàng)建的實例本身汁针。

class Human:

? arms = 2

? legs = 2

? hair = '各種顏色的頭發(fā)'

? def walk(self):

? ? print('直立行走')

? def speak(self):

? ? print('說著各式各樣的語言')

? def intro(self):

? ? # 類的方法里訪問類的屬性

? ? print('人類有%d條胳膊%d條腿' % (arms, legs))

# 報錯:NameError: name 'arms' is not defined on line 14

# 類的實例化

human = Human()

human.intro()

在類的方法里訪問類的屬性時,發(fā)現(xiàn)出現(xiàn)了變量未定義的錯誤砚尽!說明在類的方法里直接訪問類的屬性是不行的施无,那要怎么辦呢?前文說過必孤,訪問類的屬性要先實例化猾骡,然后通過 實例名.屬性 進行訪問。

但在類的方法內(nèi)訪問類的屬性時敷搪,類的實例還沒被創(chuàng)建一也。這時裁僧,self 就出現(xiàn)了,它的作用是代替實例本身,所以上面的例子正確的寫法應(yīng)該是這樣:

class Human:

? arms = 2

? legs = 2

? hair = '各種顏色的頭發(fā)'

? def walk(self):

? ? print('直立行走')

? def speak(self):

? ? print('說著各式各樣的語言')

? def intro(self):

? ? # 類的方法里訪問類的變量

? ? print('人類有%d條胳膊%d條腿' % (self.arms, self.legs))

# 類的實例化

human = Human()

human.intro()

# 輸出:人類有2條胳膊2條腿

當執(zhí)行 human.intro() 這行代碼時层皱,Python 會將 human 作為第一個參數(shù)偷偷傳遞給 self派继,這樣我們就不再需要傳入第一個參數(shù)恰力,并能通過 self 訪問類的屬性和方法了可岂。

class Human:

? arms = 2

? legs = 2

? def intro(self):

? ? print('人類有%d條胳膊%d條腿' % (self.arms, self.legs))

human = Human()? 實例化的時候,后面不用冒號

human.intro()

# 輸出:人類有2條胳膊2條腿


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者

  • 序言:七十年代末践樱,一起剝皮案震驚了整個濱河市厂画,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拷邢,老刑警劉巖袱院,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡坑填,警方通過查閱死者的電腦和手機抛人,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脐瑰,“玉大人妖枚,你說我怎么就攤上這事〔栽冢” “怎么了绝页?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寂恬。 經(jīng)常有香客問我续誉,道長,這世上最難降的妖魔是什么初肉? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任酷鸦,我火速辦了婚禮,結(jié)果婚禮上牙咏,老公的妹妹穿的比我還像新娘臼隔。我一直安慰自己,他們只是感情好妄壶,可當我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布摔握。 她就那樣靜靜地躺著,像睡著了一般丁寄。 火紅的嫁衣襯著肌膚如雪氨淌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天伊磺,我揣著相機與錄音盛正,去河邊找鬼。 笑死屑埋,一個胖子當著我的面吹牛豪筝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雀彼,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼壤蚜,長吁一口氣:“原來是場噩夢啊……” “哼即寡!你這毒婦竟也來了徊哑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤聪富,失蹤者是張志新(化名)和其女友劉穎莺丑,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡梢莽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年萧豆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昏名。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡涮雷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轻局,到底是詐尸還是另有隱情洪鸭,我是刑警寧澤,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布仑扑,位于F島的核電站览爵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏镇饮。R本人自食惡果不足惜蜓竹,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望储藐。 院中可真熱鬧俱济,春花似錦、人聲如沸邑茄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肺缕。三九已至左医,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間同木,已是汗流浹背浮梢。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留彤路,地道東北人秕硝。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像洲尊,于是被迫代替她去往敵國和親远豺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,595評論 2 350