天天看點

python學習筆記13--類和對象

1. 類和對象簡介

與C++和Java一樣,python也支援面向對象程式設計(OOP)。一個對象代表真實世界中的一個實體,它包括identity、state、behavior。identity是對象的唯一編号,在運作過程中,python會自動地為每個對象配置設定唯一的身份識别編号;state也被叫做properties或attribute,它是對象特性的展現;behavior也被稱作method,它用來傳回對對象進行操作的結果。

對象與類的差別,類似于匹薩和匹薩食譜的差別,你可以用一個匹薩食譜(類)制造很多匹薩(對象),簡單來說,對象是類的一個執行個體。

2. 類的定義

Python中通常用

class ClassName:

     initializer

     methods

來定義一個類。下面的代碼定義了一個圓形類:

#coding=utf-8
import math

class Circle:
    # 構造函數
    def __init__(self,radius = 1):
        self.radius = radius
    
    # 傳回圓的周長
    def getPerimeter(self):
        return 2 * self.radius * math.pi
    
    # 傳回圓的面積
    def getArea(self):
        return self.radius * self.radius * math.pi
    
    # 設定圓的半徑
    def setRadius(self,radius):
        self.radius = radius
        

# 建立兩個圓對象,并用.通路屬性和方法
c1 = Circle()
c2 = Circle(5)

# 第一個圓
print ("第一個圓的半徑為", c1.radius, ",周長為",c1.getPerimeter(),
       ",面積為",c1.getArea())

# 第二個圓
print ("第二個圓的半徑為", c2.radius, ",周長為",c2.getPerimeter(),
       ",面積為",c2.getArea())
           

1)initializer通常命名為__init__,這是個特殊的方法;

2)注意所有的方法,包括Initializer,都有第一個參數self,self參數是指向對象本身的,我們可以通過self.var來建立或修改類的屬性變量,如其中的self.radius=radius,并且它的作用範圍是整個類。

3)可以同dot操作符(.)來通路對象的屬性域和方法函數,如c1.radius,c1.getArea();

3. 可改變對象與不可改變對象

之前了解到數字和字元串是不可改變對象,當不可改變對象作為參數傳遞給函數f時,在函數f内部的修改不會反映在原始函數中;可改變對象則相反,若将可改變對象傳遞給函數f,則在函數f中的修改會反映在原始函數中。舉個例子:

def main():
    # 建立一個半徑為1的圓
    myCircle = Circle()
    
    # 列印半徑分别為1,2,3,4,5時的圓的面積
    n = 5
    printAreas(myCircle,n)
    
    print ("\nRadius is",myCircle.radius)   # 6
    print ("n is", n)                       # 5

def printAreas(c,times):
    print ("Radius \t\tArea")
    while times>=1:
        print (c.radius,"\t\t",c.getArea())
        c.radius += 1
        times -= 1

main()
           

可以看出,在将n=5傳遞給函數printAreas()後,n的值并沒有改變,因為其是不可改變對象;而myCircle傳遞給函數printAreas()之前,其半徑為1,而從函數結束後傳回,其半徑為6,說明myCircle在函數中的修改反映到了原始函數中,因為它是可改變對象。

4. 資料隐藏

上面的代碼中,其他函數可以直接通路對象的屬性變量,這樣在程式設計時可能會出現難以維護的情形,是以有時候我們希望能避免直接的通路或修改屬性變量,而通過getter和setter方法來操作屬性變量,這就叫做資料隐藏(data hiding),也可以叫做私有變量,python中的私有變量用__var表示。同樣,也可以用__methods定義私有方法。如修改Circle類中的radius為私有變量:

# 構造函數
    def __init__(self,radius = 1):
        self.__radius = radius
           

這樣,如果直接通路該變量的話,會出現 'Circle' object has no attribute '__radius' 錯誤。

在面向過程程式設計中,資料和操作是分離的,并且需要将資料發送給操作方法;而面向對象程式設計中,資料和相關的操作被放在一起,構成一個對象,這種方法是真實世界的鏡像,其中所有對象的屬性和操作緊密結合;面向對象程式設計提高了軟體的可重用性,并且使程式易于閱讀和維護,效率較高。