[ Python入門教程 ] Python面向對象編程(上)


    Python不僅支持面向過程編程,同時也支持面向對象編程。面向過程就是分析解決問題所需的步驟,然后用函數把這些步驟逐一實現,使用的時候再一個個調用函數就可以。面向對象則是把解決的問題按照一定規則划分為多個獨立的對象,然后通過調用對象的方法來解決問題。在編寫小程序(少於500行代碼)時,使用面向過程編程基本上不會有任何問題。但對於中等和大型項目來說,面向對象將給代碼的編寫和維護帶來很多優勢。本文主要介紹Python中面向對象的基本概念。

面向對象基本概念

  面向對象的特點主要可以概括為封裝性、繼承性、多態性。

(1)封裝性

  封裝是面向對象的核心思想,將對象的屬性和行為封裝起來,不需要讓外界知道具體實現細節,這就是封裝的思想。比如,用戶使用電腦,只需要會敲鍵盤就可以,無須知道電腦內部是如何工作的。

(2)繼承性

  繼承性主要描述的是類與類之間的關系,通過繼承,可以在無須重新編寫原有類的情況下,對原有類的功能進行擴展。

(3)多態性

  多態性指的是在程序中允許重名現象,它指在一個類中定義的屬性和方法被其他類繼承后,它們可以具有不同的數據類型或表現出不同的行為,這使得同一個屬性和方法在不同的類中具有不同的語義。

  面向對象的思想需要通過大量的實踐去學習和理解,才能將面向對象真正理解清楚。后面會通過一些例子介紹其使用方法。

類和對象基本概念

  面向對象的思想中提出了兩個概念,即類和對象。類是對某一類事物的抽象描述,是一種抽象的數據類型,一種模板。而對象用於表示現實中該類事物的個體,也就是具體化了類的描述。它們的關系是,對象是類的具體實例,類是對象的模板。對象根據類創建,一個類可以創建多個對象。比如我定義了一個學生類,那么通過類創建出來的小明、小王就叫對象。

類的定義

  在Python中使用class關鍵字定義一個類,類的主體由屬性(變量)和方法(函數)組成。通過定義一個學生類來學習下Python類的定義方法,如下:

#-*- coding:utf-8 -*-

#類的創建
class Student(object): count = 0   #類屬性
    
    def __init__(self, name, age):  #__init__為類的構造函數
        self.name = name  #實例屬性
        self.age = age  #實例屬性

    def output(self):      #實例方法
        print self.name print self.age

   上述例子中Student是類名,__init__()函數是構造函數,count、name、age是類中定義的屬性,output(self)是類中定義的方法。

對象的創建和使用

  定義完Student類之后,就可以創建對象。當一個對象被創建后,包含3個方面的特性:對象的句柄、屬性和方法。對象的句柄用於區分不同的對象,當對象被創建后,該對象會獲取一塊存儲空間,存儲空間的地址即為對象的標識。Python創建對象的方法是通過類名加圓括號的方式。實例化上述定義的Student類,格式如下:

#-*- coding:utf-8 -*- #類的創建 class Student(object): count = 0 #類屬性 def __init__(self, name, age): #__init__為類的構造函數 self.name = name #實例屬性 self.age = age #實例屬性 def output(self): #實例方法 print self.name print self.age if __name__ == '__main__': stu1 = Student('Zhangsan',18) #使用Student類對象stu1 print "stu1.name = %s" % (stu1.name,) # 利用對象stu1獲取對象屬性name。輸出stu1.name = Zhangsan print "stu1.age = %d" % (stu1.age,) # 利用對象stu1獲取對象屬性age。輸出stu1.age = 18 stu1.output() # 利用對象stu1調用output方法。

  實例化對象之后,就可以通過對象直接調用對象的屬性和方法。但是注意的是對象調用方法時,不需要給參數self賦值,self參數用於表示指向實例對象本身。

  到這里,已經學會了類的定義和對象創建方法和使用了。上述的例子中僅介紹了類的基本實例屬性和實例方法的定義,實際上實例變量還區分私有屬性和公有屬性,還有類變量等概念。同時類中的方法還包括靜態方法、類方法。

類屬性和實例屬性

  類的屬性是對數據的封裝,類中定義的屬性包括實例屬性、類屬性兩種。上述例子中count變量屬於類屬性,name、age屬於實例屬性。類變量可以在該類的所有實例中被共享。二者在定義和使用上區別主要如下:

(1)類屬性定義在類中但是在方法外的變量,實例屬性通常定義在構造函數__init__內。如下

class Student(object): count = 0   #類屬性
    
    def __init__(self, name, age):  #__init__為類的構造函數
        self.name = name  #實例屬性
        self.age = age  #實例屬性

(2)類屬性屬於類本身,可以通過類名進行訪問/修改。

#-*- coding:utf-8 -*-

#類的創建
class Student(object): count = 0   #類屬性
        
if __name__ == '__main__': Student.count = 100
    print "Student.count = %d" % (Student.count,) #輸出Student.count = 100

(3)類屬性也可以被類的所有實例訪問/修改。

#-*- coding:utf-8 -*-

#類的創建
class Student(object): count = 0   #類屬性
    
    def __init__(self, name, age):  #__init__為類的構造函數
        self.name = name  #實例屬性
        self.age = age  #實例屬性
      
if __name__ == '__main__': stu1 = Student('Zhangsan',18) #使用Student類對象stu1
    stu1.count = 100
    print "stu1.count = %s" % (stu1.count,)  # 利用對象stu1獲取類屬性count值。輸出stu1.count = 100

(4)實例屬性只能通過實例訪問。

#-*- coding:utf-8 -*-

#類的創建
class Student(object): count = 0   #類屬性
    
    def __init__(self, name, age):  #__init__為類的構造函數
        self.name = name  #實例屬性
        self.age = age  #實例屬性
      
if __name__ == '__main__': stu1 = Student('Zhangsan',18) #使用Student類對象stu1
    print "stu1.age = %d" % (stu1.age,)  # 利用對象stu1獲取實例屬性age值。輸出stu1.age = 18
    #print "Student.age = %d" % (Student.age,) # 報錯,不能通過類直接訪問實例屬性

(5)當類屬性與實例屬性名稱相同時,一個實例訪問這個屬性時實例屬性會覆蓋類屬性,但類訪問時不會。

#-*- coding:utf-8 -*-

#類的創建
class Student(object): name = "Xiaoming"   #類屬性
    
    def __init__(self, name, age):  #__init__為類的構造函數
        self.name = name  #實例屬性
        self.age = age  #實例屬性
      
if __name__ == '__main__': stu1 = Student('Zhangsan',18) #使用Student類對象stu1
    print "stu1.name = %s" % (stu1.name,)  # 輸出Zhangsan
    print "Student.name = %s" % (Student.name,)  # 輸出Xiaoming

實例方法、類方法和靜態方法

  自定義的一個類中,可能出現三種方法,實例方法、靜態方法和類方法,下面來看下三種方法的定義和使用區別。

(1)實例方法

  實例方法的第一個參數必須是"self",實例方法只能通過對象調用。

#-*- coding:utf-8 -*-

#類的創建
class Student(object): count = 0   #類屬性
    
    def __init__(self, name, age):  #__init__為類的構造函數
        self.name = name  #實例屬性
        self.age = age  #實例屬性

    def output(self):      #實例方法
        print self.name, self.age if __name__ == '__main__': stu1 = Student('Zhangsan',18) #使用Student類對象stu1
    stu1.output() # 利用對象stu1調用output方法。

  其中output()方法即為實例方法,必須帶一個參數self,調用時不必給該參數賦值。

(2)類方法  

  類方法是將類本身作為操作對象的方法。類方法可以使用函數classmethod()或@classmethod修飾器定義。與實例方法不同的是,把類作為第一個參數(cls)傳遞。類方法可以通過類名調用,也可以通過對象調用。代碼如下:

#-*- coding:utf-8 -*- #類的創建 class Student(object): count = 0 #類屬性 def __init__(self, name, age): #__init__為類的構造函數 self.name = name #實例屬性 self.age = age #實例屬性  @classmethod #方法一,定義類方法,調用類變量,getPrice中不帶self參數 def getCount(cls): print cls.count def getCount2(cls): print cls.count tran_getCount2 = classmethod(getCount2) ##方法二,定義類方法,調用類變量  if __name__ == '__main__': Student.getCount() #使用類名直接調用類方法 stu1 = Student('Zhangsan',18) #使用Student類對象stu1 stu1.getCount() # 利用對象stu1調用類方法。

  可見,類方法的使用和靜態方法十分相似。如果某個方法需要被其他實例共享,同時又需要使用當前實例的屬性,則定義為類方法。

(3)靜態方法

  靜態方法使用函數classmethod()或@classmethod修飾器定義。定義和使用方式如下:

#-*- coding:utf-8 -*- #類的創建 class Student(object): count = 0 #類屬性 def __init__(self, name, age): #__init__為類的構造函數 self.name = name #實例屬性 self.age = age #實例屬性  @staticmethod #方法一,定義類方法,調用類變量,getPrice中不帶self參數 def getCount(): print Student.count def getCount2(): print Student.count tran_getCount2 = staticmethod(getCount2) ##方法二,定義類方法,調用類變量  if __name__ == '__main__': Student.getCount() #使用類名直接調用靜態方法 stu1 = Student('Zhangsan',18) #使用Student類對象stu1 stu1.getCount() # 利用對象stu1調用靜態方法。

  這三種方法的主要區別在於參數,實例方法被綁定到一個實例,只能通過實例進行調用;但是對於靜態方法和類方法,可以通過類名和對象兩種方式進行調用。

小結

  本文介紹了Python面向對象基本概念、類的定義、對象的創建和使用、類的屬性和方法。了解這些基本概念,有助於后續的實際開發。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM