面相對象編程是最有效的的軟件編寫方法之一。在面向對象編程中,你編寫表示現實世界中的事物和情景的類,並基於這些類來創建對象。編寫類時,你定義一大類對象都有的通用行爲。基於類創建對象時,每個對象都自動具備這種通用行爲,然後可根據需要賦予每個對象獨特的個性。使用面向對象編程可模擬現實情境,其逼真程度達到了令你驚訝的地步。
創建和實用類
使用類幾乎可以模擬任何東西。下面來編寫一個表示小狗的簡單類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()+'.')
輸出結果: