12-面向對象1
定義類
定義一個類,格式如下:
class 類名:
方法列表
demo:定義一個Car類
In [1]: #定義一個Car類 In [2]: class Car(): ...: #方法 ...: def getCarInfo(self): ...: print(‘車輪的數量是:%d,顏色是:%s‘%(self.wheelNum,self.color)) ...: def move(self): ...: print(‘車正在移動...‘)
說明:
1.定義類時有2種,新式類和經典類,上面的Car為經典類,如果Car(object)則為新式類;
2.類名的命名規則為“大駝峰”
創建對象
剛剛我們已經定義了一個Car類,就好比我們有了車子的圖紙,那麽接下來就需要交給生產工人們去創造了
在python中,可以根據已經定義的類去創建出一個一個的對象,創建對象的格式為:
對象名 = 類名()
創建對象demo:
In [1]: #定義一個Car類 In [2]: class Car(): ...: #方法 ...: def getCarInfo(self): ...: print(‘車輪的數量是:%d,顏色是:%s‘%(self.wheelNum,self.color)) ...:def move(self): ...: print(‘車正在移動...‘) ...: In [3]: #創建一個對象,並用變量BMW來保存它的引用 In [4]: BMW = Car() In [5]: BMW.color = ‘黑色‘ In [6]: BMW.wheelNum = 4 In [7]: BMW.move() 車正在移動...
In [8]: print(BMW.color)
黑色
In [9]: print(BMW.wheelNum)
4
總結:
1)BMW = Car(),這樣就產生了一個Car的實例對象,此時也可以通過實例對象BMW來訪問屬性或者方法
2)第一次使用BMW.color = ‘黑色‘表示給BMW這個對象添加屬性,如果後面再次出現BMW.color = xxx ,則代表對屬性進行修改
3)BMW是一個對象,它擁有屬性(數據)和方法(函數)
4)當創建一個對象時,就是用一個模子,來制造的一個實物
__init__方法
在上一節的demo中,我們已經給BMW這個對象添加2個屬性,wheelNum和color,試想如果再創建一個對象的話,肯定也要對其添加屬性,顯然這樣很費事,那麽就需要有一個方法,在創建對象的時候,就順便把這個對象的屬性給設置了
__init__方法
<1>使用方法
Class 類名:
#初始化函數,用來完成一些默認的設定
def __init__(self):
pass
<2>__init__方法的調用
11 #定義汽車類 12 class Car(): 13 14 def __init__(self): 15 self.wheelNum = 4 16 self.color = ‘黑色‘ 17 def move(self): 18 print(‘車子在跑...‘) 19 20 #創建對象 21 BMW = Car() 22 print(‘車的顏色為:%s‘%BMW.color) 23 print(‘車輪胎數為:%d‘%BMW.wheelNum)
總結:
當創建完Car對象後,在沒有調用__init__()方法的前提下,BMW就默認擁有了2個屬性,原因是__init__()方法在被創建後,就立刻被默認調用了
想一想
既然在創建完對象後__init__()方法已經被默認執行了,那麽有沒有辦法讓對象在調用__init__()方法的時候傳遞一些參數呢?如果可以,是怎麽樣傳遞的呢?
11 #定義汽車類 12 class Car(): 13 14 def __init__(self,wheelNum,color): 15 self.wheelNum = wheelNum 16 self.color = color 17 def move(self): 18 print(‘車子在跑...‘) 19 20 #創建對象 21 BMW = Car(4,‘白色‘) 22 print(‘車的顏色為:%s‘%BMW.color) 23 print(‘車輪胎數為:%d‘%BMW.wheelNum)
python3 test.py
車的顏色為:白色
車輪胎數為:4
總結:
1)__init__()方法,在創建一個對象的時候默認被調用,不需要手動調用
2)__init__(self)中, 默認有1個參數名字為slef,如果再創建對象時傳遞了2個實參,那麽__init__(self)中除了self作為第一個形參外還需要2個形參,例如__init__(self,x,y)
3)__init__(self)中的self參數,不需要開發者傳遞,python解釋器會自動把當前的對象引用傳遞進去
魔法方法
首先看一下以下代碼:
11 #定義汽車類 12 class Car(): 13 14 def __init__(self,wheelNum,color): 15 self.wheelNum = wheelNum 16 self.color = color 17 def move(self): 18 print(‘車子在跑...‘) 19 20 #創建對象 21 BMW = Car(4,‘白色‘) 22 print(BMW) #這行代碼即是將BMW使用print進行輸出 23 print(‘車的顏色為:%s‘%BMW.color) 24 print(‘車輪胎數為:%d‘%BMW.wheelNum)
得到的結果:
python3 test.py <__main__.Car object at 0x7f2b87338940> #這裏看到的是創建出來的BMW對象在內存中的地址 車的顏色為:白色 車輪胎數為:4
__str__()方法
11 #定義汽車類 12 class Car(): 13 14 def __init__(self,wheelNum,color): 15 self.wheelNum = wheelNum 16 self.color = color 17 def move(self): 18 print(‘車子在跑...‘) 19 20 def __str__(self): 21 return "車子的顏色是:%s,輪胎數是:%d"%(self.color,self.wheelNum) 22 23 #創建對象 24 BMW = Car(4,‘白色‘) 25 print(BMW) 26 print(‘車的顏色為:%s‘%BMW.color) 27 print(‘車輪胎數為:%d‘%BMW.wheelNum)
總結:
1)在python中方法名如果是__xxxx__()的, 那麽就有特殊的功能,因此叫做“魔法”方法
2)當使用print輸出對象的時候,只要自己定義了__str__(self)方法,那麽就會打印從在這個方法中return的數據
理解self
看以下示例:
11 #定義一個類 12 class Animal(): 13 14 #方法 15 def __init__(self,name): 16 self.name = name 17 18 def printName(self): 19 print(‘名字為:%s‘%(self.name)) 20 21 #定義一個函數 22 def myPrint(animal): 23 animal.printName() 24 25 dog1 = Animal(‘旺財‘) 26 myPrint(dog1) 27 dog2 = Animal(‘來福‘) 28 myPrint(dog2)
運行結果:
名字為:旺財
名字為:來福
總結:
1)所謂的self,可以理解為自己
2)可以把self當做C++中類裏面的this指針一樣理解,就是對象自身的意思
3)某個對象調用其方法時,python解釋器會把這個對象作為第一個參數傳遞給self,所以開發者只需要傳遞後面的參數即可
12-面向對象1