1. 程式人生 > >12-面向對象1

12-面向對象1

類名 地址 得到 () 白色 style 接下來 說明 str

定義類

定義一個類,格式如下:

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