Python中的類與物件

Simon_Zhou發表於2019-04-05

1. 物件導向

1.1物件導向概念

物件導向是一種程式設計思想,是對現實世界中的事物進行抽象的方式。應用到程式碼程式設計設計中,是一種建立現實世界事物模型的方式。

1.2 物件導向和麵向過程區別

程式導向關注的是完成工作的步驟,物件導向關注的是誰能完成工作。物件導向是在完成工作的時候關注哪些個體能夠完成對應的工作,找到對應的個體即可完成對應任務。

2. 類

2.1類的概念

類是一系列事物的統稱,同類事物必定具有相同的特徵。日常事物的特徵根據特性分為狀態和行為,對應到類中是變數和方法。

特徵分類:

狀態 變數(成員變數)、行為 方法(成員方法)。

統稱:類的成員

2.2類定義語法格式

class 類名:
      pass 複製程式碼

說明:pass是空語句,不具有任何意義,僅為了保持程式結構完整性

2.3類名的命名規則

類名命名規範:滿足大駝峰命名規則

3. 物件

3.1物件的概念

物件是類的具體表現形式,是實際存在的個體。(類是一系列事物的統稱)

3.2建立物件語法格式

物件名 = 類名() 複製程式碼

3.3 注意事項

物件的建立不限制數量,一個類可以建立任意個數的物件。

4. 成員變數

4.1成員變數的概念

成員變數用於描述物件的固有狀態或屬性。

4.2定義成員變數語法格式(公有屬性/公有變數)

class 類名:       
     def __init__(self):      
         self.變數名1 = 值1    
         self.變數名2 = None複製程式碼
"""
案例:建立一個鋼筆類(Pen),
並建立物件屬性1:顏色color(None)
屬性2:價格price(1.5)ice)
"""
class Pen:  
    def __init__(self):      
        self.color = None     
        self.price = 1.5pen = Pen()複製程式碼

4.3成員變數定義語法格式(獨有屬性/獨有變數)

物件名.變數名 = 值 複製程式碼

4.4公有變數與獨有變數的區別

  • 公有變數在__init__方法中宣告,每個物件都具有該變數

  • 獨有變數在建立物件後宣告,只有當前物件具有此變數

  • 定義物件的獨有變數時,如果獨有變數名與公有變數名相同,視為修改公有變數的值;如果獨有變數名與公有變數名不相同,視為定義新的獨有屬性

  • None含義是為空,表示沒有具體的資料

4.5變數的呼叫格式

取值:物件名.變數名賦值:物件名.變數名 = 值複製程式碼

5.成員方法

5.1成員方法概念

成員方法用於描述物件的固有行為。

5.2定義成員方法語法格式

格式一(無參方法):

class 類名:            def 方法名(self):        方法體複製程式碼

格式二(有參方法)

class 類名:            def 方法名(self,形參1,形參2,…):        方法體 複製程式碼

5.3 呼叫成員方法語法格式

格式一(呼叫無參方法):

物件名.方法名()複製程式碼

格式二(呼叫有參方法):

物件名.方法名(實參1,實參2,…) 複製程式碼

6. __init__方法

6.1__init__方法的作用

__init__方法,也稱為構造方法,建立物件時為物件初始化成員變數

6.2定義__init__方法語法格式

格式一:def __init__(self):    self.變數名1 = 值1複製程式碼
格式二:
def __init__(self,形參1,形參2,…): 
   self.__屬性名1 = 形參1  
   self.__屬性名2 = 形參2 複製程式碼

6.3__init__方法呼叫和執行

  • __init__方法在建立物件時被執行,無需手工呼叫即可執行

  • __init__方法中如果有形參,在建立物件時需要傳遞對應的實參

6.4魔術方法

魔術方法是在類中宣告、定義的方法,執行時無需手工呼叫,自動執行。

7. __str__方法

7.1__str__方法的作用

__str__方法是在使用print函式列印輸出物件到螢幕時被呼叫的方法,用於返回物件的規範化字串表現形式

7.2定義__str__方法語法格式

def __str__(self):    return 列印物件是顯示的資訊   複製程式碼

8. 成員方法呼叫類成員

8.1成員方法中呼叫成員變數語法格式

self.變數名 複製程式碼

8.2成員方法中呼叫成員方法語法格式

self.方法名(實參1,實參2,…) 複製程式碼

8.3 self

self僅出現在成員方法中,指代執行該方法的物件。

9.封裝

9.1封裝的作用

封裝操作可以對受訪問保護的成員進行功能開放的控制,達到保護資料不被非法訪問的目的。

9.2定義私有變數語法格式

self.__屬性名 = 值

9.3定義私有方法語法格式

def __方法名(self,形參1,形參2,…):    方法體 複製程式碼

9.4 標準封裝語法格式

# 變數私有化格式:
    self.__屬性名 = 值
# 提供公共的訪問器格式:
def get_屬性名(self):
    return self.__屬性名
# 提供公共的修改器格式:
def set_屬性名(self,屬性名):  
    self.__屬性名 = 屬性名 複製程式碼

10.類變數

10.1類變數的概念

類變數是定義在類中,不屬於某個具體物件的特徵,被所有物件共同使用的特徵。

10.2定義類變數語法格式

class 類名:
    變數名 = 值複製程式碼

10.3呼叫類變數語法格式

# 賦值格式:
  類名.類變數名 = 值
# 取值格式:
  類名.類變數名(推薦)    物件名.類變數名(不推薦)複製程式碼

10.4注意事項

  • 類變數推薦使用類名取值訪問,也可以使用物件名取值訪問

  • 類變數只能通過類名修改;使用物件名呼叫類變數修改類變數的值時會建立新的物件獨有變數;如果此時物件具有同名物件變數,則修改對應的變數值

  • 類變數可以私有化

10.5 使用場景

場景一:定義此類所建立的所有物件共有的屬性:
​場景二:建立一個計數器,每次建立物件時對其計數加一,獲取最終建立物件的數量。
 場景三:建立一個共有屬性,所有物件共同操控該屬性。複製程式碼

11.類方法

11.1類方法的概念

類方法是定義在類中,不屬於某個具體物件的行為,被所有物件共同使用的行為

11.2定義類方法基本語法

class 類名:
    @classmethod    
    def 方法名(cls, 形參1,形參2,…):  
        方法體 複製程式碼

11.3呼叫類方法語法格式

  • 類名.類方法名(實參1,實參2,…) (推薦)

  • 物件名.類方法名(實參1,實參2,…) (不推薦)

11.4注意事項

  • 類方法中不允許使用例項變數和例項方法

  • 類方法中允許使用類變數和類方法,通過第一個引數cls進行

  • 例項方法中允許使用類變數和類方法

12.靜態方法

12.1定義靜態方法語法格式

class 類名:
    @staticmethod 
    def 方法名**(**形參1,形參2,…): 
        方法體 複製程式碼

12.2呼叫靜態方法語法格式

  • 類名.靜態方法名(實參1,實參2,…) (推薦)

  • 物件名.靜態方法名(實參1,實參2,…) (不推薦)

12.3各種方法定義規則

  • 只訪問成員變數的方法,定義成例項方法

  • 只訪問類變數的方法,定義類方法

  • 既訪問成員變數,也訪問類變數的方法,定義成例項方法

  • 既不訪問成員變數,也不訪問類變數,定義成靜態方法

案例:手機充電場景

"""
演示手機充電的案例要求:
   手機耗電操作前要先判定電量是否足夠完成此項任務  
   手機充電操作不能充電超過最大值
"""
class Phone:
    def __init__(self):   
    self.power = 100def game(self):    
    """打遊戲操作,耗電10"""
    # 判定當前電量是否能夠完成打遊戲的要求   
     if self.power >= 10:# 正常執行,減少電量  
           print("正在打遊戲,耗電10")       
           self.power = self.power - 10     
     else:# 不能正常執行,不減少電量      
         print("當前電量不足以完成打遊戲的操作,打遊戲操作被終止")
    def music(self):     
        if self.power >= 5:# 正常執行,減少電量      
        print("正在聽歌,耗電5")     
        self.power -= 5      
        else:# 不能正常執行,不減少電量      
        print("當前電量不足以完成聽歌的操作,聽歌操作被終止")  
   def call(self):     
       if self.power >= 4:# 正常執行,減少電量        
           print("正在打電話,耗電4")       
           self.power -= 4      
      else:# 不能正常執行,不減少電量      
          print("當前電量不足以完成打電話的操作,打電話操作被終止")  
      def answer(self):    
          if self.power >= 3:# 正常執行,減少電量       
      print("正在接電話,耗電3")       
      self.power -= 3     
      else:# 不能正常執行,不減少電量        
      print("當前電量不足以完成接電話的操作,接電話操作被終止")  
  def charge(self,num):# 判斷當前電量,再與充電量做比較,根據情況執行不同的內容  
      if self.power + num > 100:# 過沖        
         print("充電操作提前結束,當前電量為:100")       
         self.power = 100     
     else:# 正常衝        
          print("正在充電,衝電量是%d" % num)       
          self.power += num    def __str__(self):     
          return "當前手機電量為:%d" % self.power

# 建立一部電話,當前電量是100
p = Phone()
# 執行耗電操作
p.game()
p.game()
p.game()
p.game()
p.game()
p.game()
p.game()
p.game()
p.game()
p.game()
print(p)
p.game()
p.charge(40)
print(p)
p.game()
print(p)
p.charge(80)
print(p)​複製程式碼


相關文章