前言
我是栗子,帶大家從零開始學習Python,希望每篇文章都能讓你識訓滿滿!
今天我們要說的是面向物件的核心-----類,類能幫我們把復雜的事情變得有條理,有順序,希望大
家通過學習類能改善自己的編碼風格,使代碼變得更為好看,更加通俗易懂,

什么是類?
生物有不同的種類,食物有不同的種類,人類社會的種種商品也有不同的種類,但凡可被稱之為一
類的物體,他們都有著相似的特征和行為方式,用編程表示就是“類”(class),
類是有一些系列有共同特征和行為事物的抽象概念的總和,

1)定義一個類
當我們使用類的時候,首先需要創建一個類,使用關鍵字class可以做到這點;你還需要給這個類
起個名字和繼承關系,
小栗子:
對于可樂來講,只要是同一個品牌的可樂,他們就有著同樣的成分,這被稱之為配方,我們用
Python 中的類來表達這件事:
class CocaCola:
formula = ['caffeine','sugar','water','soda']
2)類的實體化
我們繼續按照定義好的配方(類)來生產可樂,只要配方一樣味道都是相同的,
coke_for_me = CocaCola()
coke_for_you = CocaCola()
在左邊我們創建一個變數,右邊寫上類的名稱,這樣看起來很像是賦值的行為,我們稱之為類的實體化,而被實體化后的物件,我們稱之為實體(instance),或者說是類的實體,
小栗子:
對于可樂來說,按照配方把可樂生產出來的程序就是實體化的程序,
print(CocaCola.formula)
print(coke_for_me.formula)
print(coke_for_you.formula)
運行結果:
>>> ['caffeine','sugar','water','soda']
>>> ['caffeine','sugar','water','soda']
>>> ['caffeine','sugar','water','soda']
3)類屬性參考
在類的名字后面輸入 .,IDE 就會自動聯想出我們之前在定義類的時候寫在里面的屬性,而這就是
類屬性的參考(attribute references),類的屬性會被所有類的實體共享,所以當你在類的實體后面
再點上 . ,索參考的屬性值是完全一樣的,
小栗子:
類的屬性與正常的變數并無區別,
for element in coke_for_me.formula:
print(element)
運行結果:
>>> caffeine
>>> sugar
>>> water
>>> soda
4)實體屬性
在創建了類之后,通過 object.new_atrr的形式進行一個賦值,于是我們就得到了一個新的實體的變數,實體的變數就是實體變數,而實體變數有一個專有的術語,我們稱之為實體屬性(Instance Atrribute),
小栗子:
通過下面的代碼,我們給在中國生產的可口可樂貼上了中文字樣的“可口可樂”標簽,同樣的配方,不一樣的名稱,就帶來了不同的效果,中文的可樂變得更加受歡迎!
這說明生產的程序中有必要做一些獨有的本地化調整:
class CocaCola:
formula = ['caffeine','sugar','water','soda']
coke_for_China = CocaCola()
coke_for_China.local_logo = '可口可樂' #創建實體屬性
print(coke_for_China.local_logo) #列印實體屬性參考結果
運行結果:
>>> 可口可樂
5)實體方法
類的實體可以參考屬性,方法就是函式,但我們把這個函式稱之為方法(Method),
方法是供實體使用的,因此我們還可以稱之為實體方法(Instance Method),
小栗子:
當你喝掉一瓶可樂的時候,你會從咖啡因和大量的糖分中獲得能量,如果使用類的方法來表示可樂的這個“功能”的話,那應該是這樣的:
class CocaCola:
formula = ['caffeine','sugar','water','soda']
def drink(self):
print('Energy!')
coke = CocaCola()
coke.drink()
運行結果:
>>> Energy!
self?
我知道你現在的關注點一定在這個奇怪的地方——似乎沒有派上任何用場的 self 引數,我們來說明一下原理,其實很簡單,我們不妨修改一下代碼:
class CocaCola:
formula = ['caffeine','sugar','water','soda']
def drink(coke): # HERE!
print('Energy!')
coke = CocaCola()
coke.drink()
運行結果:
>>> Energy!
怎么樣,現在有些頭緒了吧?和你想的一樣,這個引數其實就是被創建的實體本身!就是將一個個物件作為引數放入函式括號內,
再進一步說,一旦一個類被實體化,那么我們其實可以同樣使用原來的方式:
coke = CocaCola
coke.drink() == CocaCola.drink(coke) #左右兩邊的寫法完全一致
被實體化的物件會被編譯器默默地傳入后面方法的括號中,作為第一個引數,
上面這兩種方法是一樣的,但是我們更多地會寫成前面那種形式,
其實 self 這個引數名稱是可以隨意修改名稱的(編譯器并不會因此而報錯),但是按照 Python 的
規矩,我們還是統一使用 self,

類的繼承
時代在變遷,可樂的種類也在變化我們按照最新的來定于:
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))
不同的本地化策略和新的種類的開發,使得生產并非僅僅是換個標簽這么簡單了,包裝、容積、甚至是配方都會發生變化,但唯一不變的是:它們永遠是可口可樂,
所有的子品類都會繼承可口可樂的品牌,Python 中類自然也有對應的概念,叫做類的繼承
(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()
我們在新的類 CaffeineFree 后面的括號中放入 CocaCola,這就表示這個類是繼承于 CocaCola 這
個父類的,而 CaffeineFree 則成為了 CocaCola 子類,類中的變數和方法可以完全被子類繼承,
但如需有特殊的改動也可以進行覆寫(override),
可以看到CAFFEINE-FREE存在著咖啡因含量、成分這兩處不同的地方,并且在新的類中也僅僅是
重寫了這兩個地方,其他沒有重寫的地方,方法和屬性都能照常使用,

結尾
哈哈哈 !文寫到這里結束了,下一篇入門到實戰的系列大概率會寫第三方模塊的一些東西,如果
有這方面還不是很清楚的小可愛,可以提前預約下~
原始碼基地:點擊藍色字體或私信小編06即可免費拿!往期原始碼也都在地哦~
想跟大家一起交流學習滴可以加入我的公眾號關注下哈:Python顧木子吖!
歡迎一起學習交流、往期的文章內容專案素材原始碼等都在里面可以找到滴!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/356993.html
標籤:python
