一些關(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條腿