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' 錯誤。


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章