Python之類

面相對象編程是最有效的的軟件編寫方法之一。在面向對象編程中,你編寫表示現實世界中的事物和情景的類,並基於這些類來創建對象。編寫類時,你定義一大類對象都有的通用行爲。基於類創建對象時,每個對象都自動具備這種通用行爲,然後可根據需要賦予每個對象獨特的個性。使用面向對象編程可模擬現實情境,其逼真程度達到了令你驚訝的地步。

創建和實用類

使用類幾乎可以模擬任何東西。下面來編寫一個表示小狗的簡單類Dog——它表示的不是特定的小狗,而是任何小狗。對於大多數寵物狗,我們都知道些什麼呢?名字、年齡、會蹲下以及打滾。
創建Dog類
dog.py

class Dog():      #類的首寫字母要大寫
                  #self形參必不可少,它是一個指向實例本身的引用
    def __init__(self,name,age):   #開頭和末尾有兩個下劃線
        self.name = name #以self爲前綴的變量都可供類中的所有方法使用,我們可以通過類的任何實例來訪問這些變量
        self.age  = age

    def sit(self):
        #模擬小狗蹲下
        print(self.name.title()+" is now sitting.")

    def roll_over(self):
        #模擬小狗打盹
        print(self.name.title()+" rolled over!")

根據類創建實例

下面來創建一個表示特定小狗的實例;

class Dog():     
   ---snip----
my_dog = Dog('Jack',8)
my_dog.sit()
my_dog.roll_over()
print("小狗的年齡:"+str(my_dog.age))

輸出結果:

這裏寫圖片描述

修改屬性的值

直接修改屬性的值

要修改屬性的值,最簡單的方式是通過實例直接修改它。
例如:

class Dog():     
   ---snip----
my_dog = Dog('Jack',8)
my_dog.sit()
my_dog.roll_over()
print("小狗的年齡:"+str(my_dog.age))
my_dog.age = 9
print("小狗的年齡:"+str(my_dog.age))

輸出結果:

這裏寫圖片描述

通過方法修改屬性的值

如果有替你更新屬性的方法,將大有裨益。這樣你無需直接訪問屬性,而可將值傳遞給一個方法,由它在內部進行更新。
例如:

class Dog():     
   ---snip----
    def update_age(self,modify_age):
        self.age = modify_age
my_dog = Dog('Jack',8)
my_dog.sit()
my_dog.roll_over()
print("小狗的年齡:"+str(my_dog.age))
my_dog.update_age(9)
print("小狗的年齡:"+str(my_dog.age))

輸出結果:

這裏寫圖片描述

繼承

編寫類時,並非總是要從將空白開始。如果你要編寫的類是另一個現成類的特殊版本,可使用繼承。一個類繼承另一個類時,它將自動獲得另一個類的所有屬性和方法,同時還可以定義自己的屬性和方法。

子類的方法_init_()

創建子類的實例時,Python首先需要完成的任務是給父類的所有屬性賦值。爲此,子類的方法_init_()需要父類施以援手。
例如,基於以上的案例,模擬黑色的小狗,它具備小狗所有的功能:

class Dog():     
   ---snip----
class BlackDog(Dog):
    #黑色小狗的獨特之處
    def __init__(self,name,age):
        super().__init__(name,age)
        self.color = 'black'

my_dog = BlackDog('Jack',8)
my_dog.sit()
my_dog.roll_over()
print("小狗的年齡:"+str(my_dog.age))
my_dog.update_age(9)
print("小狗的年齡:"+str(my_dog.age))
print("小狗的顏色:"+my_dog.color)

輸出結果:

這裏寫圖片描述

重寫父類的方法

對於父類的方法,只要它不符合子類模擬的實物的行爲,都可對其進行重寫。爲此,可在子類中定義一個這樣的方法,即它與要重寫的父類方法同名。這樣,Python將不會考慮這個父類方法。而只關注你在子類中定義的相應的方法
假如,黑色的狗不會蹲下

class Dog():     
   ---snip----
class BlackDog(Dog):
    #黑色小狗的獨特之處
    def __init__(self,name,age):
        super().__init__(name,age)
        self.color = 'black'
    def sit(self):
        print("黑色的狗不會蹲下")

my_dog = BlackDog('Jack',8)
my_dog.sit()

輸出結果:

這裏寫圖片描述

導入類

隨着你不斷地給類添加功能,文件可能變得很長,即便你妥善地使用了繼承亦如此。爲遵循Python的總體理念,應該讓文件儘可能整潔。爲在這方面提供幫助,Python允許你將類存儲在模塊中,然後再主程序中導入所需要的模塊。

導入單個類

首先定義一個Dog類,該類包含dog屬性和方法(行爲)。

class Dog():      #類的首寫字母要大寫
    #self形參必不可少,它是一個指向實例本身的引用
    def __init__(self,name,age):    #開頭和末尾有兩個下劃線
        self.name = name     #以self爲前綴的變量都可供類中的所有方法使用,我們可以通過類的任何實例來訪問這些變量
        self.age  = age

    def sit(self):
        #模擬小狗蹲下
        print(self.name.title()+" is now sitting.")

    def roll_over(self):
        #模擬小狗打盹
        print(self.name.title()+" rolled over!")
    def update_age(self,modify_age):
        self.age = modify_age

下面創建一個my_dog.py,使其導入Dog類並創建實例

from dog import Dog
my_dog = Dog('Jack',8)
my_dog.sit()
my_dog.roll_over()
print("小狗的年齡:"+str(my_dog.age))
my_dog.update_age(9)
print("小狗的年齡:"+str(my_dog.age))

輸出結果:

這裏寫圖片描述

注意:
可以從一個模塊導入多個類

from dog import Dog,BlackDog

也可以導入整個模塊

from dog

Python標準庫

Python標準庫是一組模塊,安裝Python都包含它。你現在對類的工作原理已有大致瞭解,可以使用其他程序員編寫的模塊了。
字典讓你能夠將信息關聯起來,但他們不記錄你添加鍵-值對的順序。要創建字典並記錄其中的鍵-值對的添加順序,可使用模塊collections中的OrderdDict類。
例如:

from collections import OrderedDict

favorite_languges = OrderedDict()
favorite_languges['蘇林東'] = 'Python'
favorite_languges['程菲']   = 'C'
favorite_languges['楊明']   = 'C++'

for name,value in favorite_languges.items():
print(name.title()+"最喜歡的編程語言:"+value.title()+'.')

輸出結果:

這裏寫圖片描述

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