摘要:小栗子對(duì)于可樂來講,只要是同一個(gè)品牌的可樂,他們就有著同樣的成分,這被稱之為配方。小栗子對(duì)于可樂來說,按照配方把可樂生產(chǎn)出來的過程就是實(shí)例化的過程。小栗子類的屬性與正常的變量并無區(qū)別。
我是栗子,帶大家從零開始學(xué)習(xí)Python,希望每篇文章都能讓你收獲滿滿!
今天我們要說的是面向?qū)ο蟮暮诵?----類,類能幫我們把復(fù)雜的事情變得有條理,有順序,希望大
家通過學(xué)習(xí)類能改善自己的編碼風(fēng)格,使代碼變得更為好看,更加通俗易懂。
生物有不同的種類,食物有不同的種類,人類社會(huì)的種種商品也有不同的種類。但凡可被稱之為一
類的物體,他們都有著相似的特征和行為方式。用編程表示就是“類”(class)。
類是有一些系列有共同特征和行為事物的抽象概念的總和。
當(dāng)我們使用類的時(shí)候,首先需要?jiǎng)?chuàng)建一個(gè)類。使用關(guān)鍵字class可以做到這點(diǎn);你還需要給這個(gè)類
起個(gè)名字和繼承關(guān)系。
小栗子:
對(duì)于可樂來講,只要是同一個(gè)品牌的可樂,他們就有著同樣的成分,這被稱之為配方。我們用
Python 中的類來表達(dá)這件事:
class CocaCola: formula = ["caffeine","sugar","water","soda"]
我們繼續(xù)按照定義好的配方(類)來生產(chǎn)可樂。只要配方一樣味道都是相同的。
coke_for_me = CocaCola()coke_for_you = CocaCola()
在左邊我們創(chuàng)建一個(gè)變量,右邊寫上類的名稱,這樣看起來很像是賦值的行為,我們稱之為類的實(shí)例化。而被實(shí)例化后的對(duì)象,我們稱之為實(shí)例(instance),或者說是類的實(shí)例。
小栗子:
對(duì)于可樂來說,按照配方把可樂生產(chǎn)出來的過程就是實(shí)例化的過程。
print(CocaCola.formula)print(coke_for_me.formula)print(coke_for_you.formula)
運(yùn)行結(jié)果:
>>> ["caffeine","sugar","water","soda"]>>> ["caffeine","sugar","water","soda"]>>> ["caffeine","sugar","water","soda"]
在類的名字后面輸入?.
,IDE 就會(huì)自動(dòng)聯(lián)想出我們之前在定義類的時(shí)候?qū)懺诶锩娴膶傩裕@就是
類屬性的引用(attribute references)。類的屬性會(huì)被所有類的實(shí)例共享,所以當(dāng)你在類的實(shí)例后面
再點(diǎn)上?.
?,索引用的屬性值是完全一樣的。
小栗子:
類的屬性與正常的變量并無區(qū)別。
for element in coke_for_me.formula: print(element)
運(yùn)行結(jié)果:
>>> caffeine>>> sugar>>> water>>> soda
在創(chuàng)建了類之后,通過?object.new_atrr
的形式進(jìn)行一個(gè)賦值,于是我們就得到了一個(gè)新的實(shí)例的變量,實(shí)例的變量就是實(shí)例變量,而實(shí)例變量有一個(gè)專有的術(shù)語,我們稱之為實(shí)例屬性(Instance Atrribute)。
小栗子:
通過下面的代碼,我們給在中國(guó)生產(chǎn)的可口可樂貼上了中文字樣的“可口可樂”標(biāo)簽,同樣的配方,不一樣的名稱,就帶來了不同的效果,中文的可樂變得更加受歡迎!
這說明生產(chǎn)的過程中有必要做一些獨(dú)有的本地化調(diào)整:
class CocaCola: formula = ["caffeine","sugar","water","soda"]coke_for_China = CocaCola()coke_for_China.local_logo = "可口可樂" #創(chuàng)建實(shí)例屬性print(coke_for_China.local_logo) #打印實(shí)例屬性引用結(jié)果
運(yùn)行結(jié)果:
>>> 可口可樂
類的實(shí)例可以引用屬性,方法就是函數(shù),但我們把這個(gè)函數(shù)稱之為方法(Method)。
方法是供實(shí)例使用的,因此我們還可以稱之為實(shí)例方法(Instance Method)。
小栗子:
當(dāng)你喝掉一瓶可樂的時(shí)候,你會(huì)從咖啡因和大量的糖分中獲得能量,如果使用類的方法來表示可樂的這個(gè)“功能”的話,那應(yīng)該是這樣的:
class CocaCola: formula = ["caffeine","sugar","water","soda"] def drink(self): print("Energy!") coke = CocaCola()coke.drink()
運(yùn)行結(jié)果:
>>> Energy!
我知道你現(xiàn)在的關(guān)注點(diǎn)一定在這個(gè)奇怪的地方——似乎沒有派上任何用場(chǎng)的?self
?參數(shù)。我們來說明一下原理,其實(shí)很簡(jiǎn)單,我們不妨修改一下代碼:
class CocaCola: formula = ["caffeine","sugar","water","soda"] def drink(coke): # HERE! print("Energy!") coke = CocaCola()coke.drink()
運(yùn)行結(jié)果:
>>> Energy!
怎么樣,現(xiàn)在有些頭緒了吧?和你想的一樣,這個(gè)參數(shù)其實(shí)就是被創(chuàng)建的實(shí)例本身!就是將一個(gè)個(gè)對(duì)象作為參數(shù)放入函數(shù)括號(hào)內(nèi)。
再進(jìn)一步說,一旦一個(gè)類被實(shí)例化,那么我們其實(shí)可以同樣使用原來的方式:
coke = CocaColacoke.drink() == CocaCola.drink(coke) #左右兩邊的寫法完全一致
被實(shí)例化的對(duì)象會(huì)被編譯器默默地傳入后面方法的括號(hào)中,作為第一個(gè)參數(shù)。
上面這兩種方法是一樣的,但是我們更多地會(huì)寫成前面那種形式。
其實(shí)?self
?這個(gè)參數(shù)名稱是可以隨意修改名稱的(編譯器并不會(huì)因此而報(bào)錯(cuò)),但是按照 Python 的
規(guī)矩,我們還是統(tǒng)一使用?self
。
時(shí)代在變遷,可樂的種類也在變化我們按照最新的來定于:
class CocaCola: calories = 140 sodium = 45 total_carb = 39 caffeine = 34 ingredients = [ "High Fructose Corn Syrup", "Carbonated Water", "Phosphoric Acid", "Natural Flavors", "Caramel Color", "Caffeine" ] def __init__(self,logo_name): self.local_logo = logo_name def drink(self): print("You got {} cal energy!".format(self.calories))
不同的本地化策略和新的種類的開發(fā),使得生產(chǎn)并非僅僅是換個(gè)標(biāo)簽這么簡(jiǎn)單了,包裝、容積、甚至是配方都會(huì)發(fā)生變化,但唯一不變的是:它們永遠(yuǎn)是可口可樂。
所有的子品類都會(huì)繼承可口可樂的品牌,Python 中類自然也有對(duì)應(yīng)的概念,叫做類的繼承
(inheritance),我們拿無咖可樂(CAFFEINE-FREE)作為例子:
class CaffeineFree(CocaCola): caffeine = 0 ingredients = [ "High Fructose Corn Syrup", "Carbonated Water", "Phosphoric Acid", "Natural Flavors", "Caramel Color", ]coke_a = CaffeineFree("Cocacola-FREE")coke_a.drink()
我們?cè)谛碌念?CaffeineFree 后面的括號(hào)中放入 CocaCola,這就表示這個(gè)類是繼承于 CocaCola 這
個(gè)父類的,而 CaffeineFree 則成為了 CocaCola 子類。類中的變量和方法可以完全被子類繼承,
但如需有特殊的改動(dòng)也可以進(jìn)行覆蓋(override)。
可以看到CAFFEINE-FREE存在著咖啡因含量、成分這兩處不同的地方,并且在新的類中也僅僅是
重寫了這兩個(gè)地方,其他沒有重寫的地方,方法和屬性都能照常使用。
哈哈哈 !文寫到這里結(jié)束了,下一篇入門到實(shí)戰(zhàn)的系列大概率會(huì)寫第三方模塊的一些東西,如果
有這方面還不是很清楚的小可愛,可以提前預(yù)約下~
源碼基地:點(diǎn)擊藍(lán)色字體或私信小編06即可免費(fèi)拿!往期源碼也都在地哦~
想跟大家一起交流學(xué)習(xí)滴可以加入我的公眾號(hào)關(guān)注下哈:Python顧木子吖!
歡迎一起學(xué)習(xí)交流、往期的文章內(nèi)容項(xiàng)目素材源碼等都在里面可以找到滴!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/123371.html
必須要看的前言 本文風(fēng)格:以??簡(jiǎn)單易懂??的語言帶你徹底搞懂KNN,了解什么是有監(jiān)督學(xué)習(xí)算法。 認(rèn)真看完這篇文章,徹底了解KNN、了解監(jiān)督學(xué)習(xí)算法絕對(duì)是一樣很簡(jiǎn)單的事情。 注:本篇文章非常詳細(xì),同時(shí)我也附加了Python代碼,歡迎收藏后慢慢閱讀。 目錄 必須要看的前言監(jiān)督學(xué)習(xí)算法KNN/K近鄰算法1 算法原理1.1 實(shí)現(xiàn)過程1.2 距離的確定 2 算法的優(yōu)缺點(diǎn)3 算法的變種3.1 變...
本文涵蓋 面試題的引入 對(duì)事件循環(huán)面試題執(zhí)行順序的一些疑問 通過面試題對(duì)微任務(wù)、事件循環(huán)、定時(shí)器等對(duì)深入理解 結(jié)論總結(jié) 面試題 面試題如下,大家可以先試著寫一下輸出結(jié)果,然后再看我下面的詳細(xì)講解,看看會(huì)不會(huì)有什么出入,如果把整個(gè)順序弄清楚 Node.js 的執(zhí)行順序應(yīng)該就沒問題了。 async function async1(){ console.log(async1 start) ...
摘要:本文的分享主要圍繞以下幾個(gè)方面能做什么常見應(yīng)用場(chǎng)景介紹如何學(xué)習(xí)語法基礎(chǔ)實(shí)戰(zhàn)面向?qū)ο缶幊虒?shí)戰(zhàn)練熟基礎(chǔ)小游戲項(xiàng)目的實(shí)現(xiàn)與實(shí)戰(zhàn)一能做什么一種編程語言往往可以應(yīng)用于多方面,有些方面比較常用,有些方面極為常用。比如表示是一個(gè)空列表。 摘要:Python語言的教程雖然隨處可見,但是忙于日常業(yè)務(wù)/學(xué)習(xí)的你或許:一直想要找個(gè)時(shí)間學(xué)一點(diǎn),但是又不知道該從何下手?本文將從Python能做什么,如何學(xué)習(xí)Py...
閱讀 2863·2021-11-22 11:56
閱讀 3563·2021-11-15 11:39
閱讀 908·2021-09-24 09:48
閱讀 767·2021-08-17 10:14
閱讀 1335·2019-08-30 15:55
閱讀 2762·2019-08-30 15:55
閱讀 1320·2019-08-30 15:44
閱讀 2789·2019-08-30 10:59