熱線電話:13121318867

登錄
首頁大數據時代不會面向對象,肯定學不好!簡易的Python面向對象攻略來啦
不會面向對象,肯定學不好!簡易的Python面向對象攻略來啦
2021-01-22
收藏

來源:麥叔編程

作者:麥叔

1. 第一個類

面向對象的概念

設想一下,你如何開發下面這個游戲:

不會面向對象,肯定學不好!簡易的Python面向對象攻略來啦

很難想象,用簡單的字符串,int, list等數據類型就能表達和開發出這么復雜的游戲(實際上是可以的,只是很麻煩)。

更好的做法是使用面向對象的技術。這個游戲無非就是一個個對象互相打打殺殺!

編程是對現實世界的模擬,我們先來看看面向對象的幾個核心概念:

  • 類 - 模板,如人類
  • 實例 - 用模板造出的對象,如貂蟬
  • 屬性 - 是特征,如姓名
  • 方法 - 是行為,是技能,如攻擊

在早期的編程語言中,比如C語言中,是沒有面向對象的概念的,所有的程序,不管多么復雜,都是用數字,字符串等來表達的。那時候我們稱為面向過程編程。

面向過程編程:Procedure Oriented Programming 是一種以過程和任務為中心的編程思想。通過一系列具體的步驟操作相關的數據,實現軟件功能。

面向對象編程

Object Oriented Programming 是一種以對象為基礎的編程思想。把數據和操作封裝到對象中,通過對象一系列的交互,實現軟件功能。

下面我用一個小的例子帶你理解面向對象。

假設有兩條狗,他們分別有自己的名字,身高,血量和攻擊力。我們要模擬一條狗攻擊了另外一條狗。

面向過程的代碼可能是這樣的

#表示狗的屬性 dog1_name = '大黃'
dog1_height = 0.7
dog1_blood = 1.0
dog1_power = 0.1

dog2_name = '二黑'
dog2_height = 0.7
dog2_blood = 1.0
dog2_power = 0.2 #dog1攻擊dog2 print('dog1 attacking dog2')
dog2_blood = dog2_blood - dog1_power #dog2攻擊dog1 print('dog2 attacking dog1')
dog1_blood = dog1_blood - dog2_power

這顯然不好,如果有100條狗互相亂咬呢?

我們來看看面向對象的寫法:

面向對象的代碼

#類是一個模板 class Dog:  #構造方法  def __init__(self, name, height, blood, power):
  self.name = name
  self.height = height
  self.blood = blood
  self.power = power

 def attack(self, dog2):
  dog2.blood = dog2.blood - self.power

d1 = Dog('大黃'0.7103#創建第1個實例 d2 = Dog('二黑'0.5104#創建第2個實例 print(f'攻擊前:{d2.blood}')
d1.attack(d2)
print(f'攻擊后:{d2.blood}')
  • 首先創建了一個Dog類,它包含了4個屬性,和一個方法。
  • 接下來,我們就像女媧造人一樣,用Dog類作為模板,構建出兩個狗d1和d2。
  • 然后d1攻擊了d2。

這雖然看起來代碼比上面還長,但是代碼很自然,更容易懂,更有“人性”。

如果我們要創建100個Dog,也很容易。把這100個Dog放到一個列表中也很方便。

下面我們來庖丁解牛,從零開始學習面向對象的核心概念。

2.構造方法和屬性

我們再回到前面的例子,從零開始,理解類的核心概念。

最簡單的類

#最簡單的類 class Dog:   pass 

這是一個最簡單的類,它里面什么都沒有,就像一個空白的信封。注意類的定義以class開頭,后面是類的名字,類名一般用大寫。

創建實例

雖然它什么都沒有,但我們仍然可以用它來創建實例。

d1 = Dog()
d2 = Dog() print(id(d1)) print(id(d2))

創建實例通過使用類名加括號,有的類需要傳入參數。通過下面的打印可以看出d1和d2的內存地址不同,他們確實是不同的實例,在內存里有自己獨立的房間。

Python是一個動態語言,我們可以給類動態的添加屬性:

d1.name = '旺財' print(d1.name) print(d2.name)  #報錯,因為d2沒有name屬性 

正常情況下類不是空的,我們要求創建實例的時候就必須填寫必要的信息,這樣才是一個有效的實例。

構造方法 init

我們創建實例的過程,會調用了一個叫做__init__的方法。前面的Dog中沒有init方法,它就給我們創建了一個空的對象出來。實際上Python調用了Object類的init方法,這個方法不需要傳任何參數,也不做任何事情。

現在我們給Dog類加上__init__方法:

#類是一個模板 class Dog:  #構造方法  def __init__(self, name, height, blood, power):
  self.name = name
  self.height = height
  self.blood = blood
  self.power = power

這時候如果再去創建Dog的實例,而不傳入參數就會報錯了:

d1 = Dog() #報錯,必須要傳入指定的參數 

init函數的第一個參數永遠是self,表示當前對象,表示自己。后面的參數看我們自己的需要,我們希望Dog類有name, height, blood和power等幾個屬性,所以我們就加了這幾個參數。

現在來正常的創建兩個實例:

d1 = Dog('大黃'0.7103#創建第1個實例 d2 = Dog('二黑'0.5104#創建第2個實例 

創建實例的時候,不需要傳入第一個self參數,Python會自動傳入。我們只要傳入self后面的幾個參數就行。注意參數的順序。

self和屬性

這里需要認識一下self:

  • self表示當前的實例。
  • self只用在類的內部,在外部就直接使用變量名了,如d1,d2
  • 通過self.name='XXX'就給當前實例創建了一個名為name的屬性。
  • 不同實例的屬性的值是不同的。

默認屬性

并不是所有的屬性都一定要在構造方法中傳入,比如我們規定:blood在創建的時候默認都是10,也就是滿血。

那么就沒必要在init中傳入這個參數了。我們可以在init函數中設置默認的值為10。

class Dog:  #構造方法  def __init__(self, name, height, power):
  self.name = name
  self.height = height
  self.blood = 10   self.power = power

訪問和修改屬性

  • 在類的內部,通過self.xxx訪問屬性
  • 在類的外部,通過變量名 d1.xxx訪問屬性
  • 修改屬性,用賦值語句賦值即可:
  • 外部:d1.name = '大黃黃'。
  • 內部:self.name = '大黃黃'

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢