python高級-面向對象(11)

1、面向過程和麪向對象

  • 面向過程:根據業務邏輯從上到下寫代碼
  • 面向對象:將數據與函數綁定到一塊兒,進行封裝,這樣可以更快速的開發程序,減小了重複代碼的重寫過程

2、類和對象

一、類的概念python

面向對象編程的2個很是重要的概念:類和對象是面向對象編程的核心。編程

在使用對象的過程當中,爲了將具備共同特徵和行爲的一組對象抽象定義,提出了另一個新的概念——類安全

  1. 類是對象的模板,例如:人類,是人這種生物的模板。
  2. 類是一個抽象的概念,是一類事物的合集。

例如:人類,汽車類,鳥類,狗類,都是多個具備相同特徵事物的合集概念。函數

二、對象的概念(萬事萬物皆對象)this

對象是具體事物,具備惟一性,必定能肯定是哪個的就是對象。spa

例如:周杰倫、地球、老王的寶馬、小李的泰迪設計

  • 大衆汽車(類):沒辦法肯定那一輛,大衆生產的都叫奔馳汽車
  • 大衆寶來汽車(類):大衆寶來也是全部寶來汽車的類,只不過比大衆汽車的範圍小一點而已,也能夠理解爲大衆寶來汽車類是大衆汽車類的子類。
  • 個人大衆汽車(對象):能夠肯定,由於我就一輛大衆汽車。不會有人賣兩輛大衆吧,若是有還不如去買一輛奧迪是否是。
  • 大黃狗(類):由於全部大一點的黃色的都叫大黃狗,沒辦法肯定哪個
  • 金毛(類):金毛也是一類狗的統稱,沒辦法肯定惟一的一個。
  • 個人金毛(對象):能夠肯定,具備惟一性。

 

3、類的構成

類(Class) 由3個部分構成指針

  • 類的名稱:類名
  • 類的屬性:一組數據
  • 類的方法:容許對進行操做的方法 (行爲)

狗類的設計code

  • 類名:狗(Dog)
  • 屬性:品種 、毛色、性別、名字、 腿的數量
  • 方法(行爲/功能):叫 、跑、咬人、吃、搖尾巴

 

4、定義類

定義一個類,格式以下:對象

class 類名: 方法列表

舉個例子:定義一個Car類

#定義類
class Car: #方法
    def getCarInfo(self): print("這是一輛%s牌汽車"%self.name) def move(self) print("車正在移動")

說明:

  • 定義類有2種:新式類和經典類(基類),上面Car爲經典類(基類),若是是Car(object)則爲新式類
  • 類名的命名規則遵循駝峯制

 

5、定義對象

經過上面,定義了一個Car類;就比如有車一個張圖紙,那麼接下來就應該把圖紙交給生成工人們去生成了

python中,能夠根據已經定義的類去建立出一個個對象

建立對象的格式爲:

對象名 = 類名()

建立對象demo

#定義類
class Car: def move(self): print("車在奔跑") #建立對象
BMW = Car() #對象調用方法
BMW.move() #給對象添加屬性
BMW.name = "寶馬"
#經過點語法調用對象屬性
print(BMW.name)

運行結果爲:

車在奔跑
寶馬

說明:

  • BMW = Car(),這樣就產生了一個Car的實例對象,此時也能夠經過實例對象BMW來訪問屬性或者方法
  • 第一次使用BMW.name = 「寶馬」表示給BMW這個對象添加屬性,若是後面再次出現BMW.name= xxx表示對屬性進行修改
  • BMW是一個對象,它擁有屬性(數據)和方法(函數)
  • 當建立一個對象時,就是用一個模子,來製造一個實物

 

6、_ _init_ _()方法

在上一面的demo中,咱們已經給BMW這個對象添加了1個屬性name,試想若是再次建立一個對象的話,確定也須要進行添加屬性,顯然這樣作很費事,那麼有沒有辦法可以在建立對象的時候,就順便把車這個對象的屬性給設置呢?

答案就是:_ _init_ _()方法

一、使用方法

class 類名: #初始化方法,用來完成一些默認的設定
    def __init__(): pass

二、_ _init_ _()方法的調用

class Car: def __init__(self): self.name = "寶馬"
    def move(): print("車在跑") #建立對象
bmw = Car() print("這是一輛%s牌汽車"%bmw.name)

運行結果爲:這是一輛寶馬牌汽車

說明:當建立Car對象後,在沒有調用__init__()方法的前提下,bmw就默認有了name屬性爲寶馬

三、自定義_ _init_ _()方法

class Car: def __init__(self,newName,newColor): self.name = newName self.color = newColor def move(): print("車在跑") #建立對象
bmw = Car("寶馬","黑色") print("這是一輛%s牌汽車"%bmw.name) print("這輛汽車的顏色是%s"%bmw.color)

運行結果爲:

這是一輛寶馬牌汽車
這輛汽車的顏色是黑色

說明:

  • __init__()方法,在建立一個對象時默認被調用,不須要手動調用
  • __init__()方法,默認有一個參數名self,若是在建立對象時須要傳遞2個參數,那麼__init__()中self做爲第一個參數外還須要2個參數,例如__init__(self,x,y)
  • __init__()方法,中的self參數,不須要開發者傳遞,python解釋器會自動把當前對象的引用傳遞進去

 

7、_ _str_ _()方法

class Car: def __init__(self,newName,newColor): self.name = newName self.color = newColor def move(): print("車在跑") def __str__(self): msg = "你好,我是一輛%s的%s牌汽車"%(self.color,self.name) return msg #建立對象
bmw = Car("寶馬","黑色") print(bmw)

運行結果爲:你好,我是一輛黑色的寶馬牌汽車

說明:

  • 在python中方法名若是是__XXX__()的,那麼就有特殊的功能,所以叫作「魔法」方法
  • 當使用print輸出對象的時候,只要本身定了__str__()方法,那麼就會打印這個方法中的return的數據

 

8、self

  • 所謂self,能夠理解爲本身
  • 能夠把self當作C++或者Java中的this指針同樣理解,就是對象自己的意思
  • 某個對象調用__init__()方法時,python解釋器會把這個對象做爲第一個參數傳遞給self,因此開發者只須要傳遞後面的參數便可

 

9、屬性的set和get方法

若是有一個對象,當須要對其進行修改屬性時,有2種方法

  • 對象名.屬性名 = 數據 —->直接修改
  • 對象名.方法名() —->間接修改

爲了更好的保存屬性安全,即不能隨意修改,通常的處理方式爲

  • 將屬性定義爲私有屬性
  • 添加一個能夠調用的方法,供調用
 1 class Person(object):  2     def __init__(self, name):  3         #以__開頭的屬性表示私有屬性,不容許外部訪問
 4         self.__name = name  5 
 6     def getName(self):  7         return self.__name
 8 
 9     def setName(self,newName): 10         if len(newName)>=5: 11             self.__name = newName 12         else: 13             print("Error:輸入的名字長度不夠") 14 
15 xiaoming = Person("Se7eN_HOU") 16 print(xiaoming.__name)

運行結果爲:

Traceback (most recent call last): File "C:\Users\Se7eN_HOU\Desktop\demo.py", line 16, in <module>
    print(xiaoming.__name) AttributeError: 'Person' object has no attribute '__name'

修改成以下代碼:

class Person(object): def __init__(self, name): #以__開頭的屬性表示私有屬性,不容許外部訪問
        self.__name = name def getName(self): return self.__name

    def setName(self,newName): if len(newName)>=5: self.__name = newName else: print("Error:輸入的名字長度不夠") xiaoming = Person("Se7eN") xiaoming.setName("Se7eN_HOU") print(xiaoming.getName()) xiaoming.setName("HOU") print(xiaoming.getName())

運行結果爲:

Se7eN_HOU
Error:輸入的名字長度不夠
Se7eN_HOU

說明:

  • Python中沒有像C++中public和private這些關鍵字來區別公有屬性和私有屬性
  • 它是以屬性命名方式來區分,若是在屬性名前面加了2個下劃線’__’,則代表該屬性是私有屬性,不然爲公有屬性(方法也是同樣,方法名前面加了2個下劃線的話表示該方法是私有的,不然爲公有的)。

 

10、_ _del_ _()方法

建立對象後,python解釋器默認調用_ _init_ _()方法;

當刪除一個對象時,python解釋器也會默認調用一個方法,這個方法爲_ _del_ _()方法

class Person(object): #初始化方法,建立對象會被自動調用
    def __init__(self, name): print("__init__方法被調用") self.__name = name #析構方法:當對象刪除是會被調用
    def __del__(self): print("__del__方法被調用") def getName(self): return self.__name

    def setName(self,newName): if len(newName)>=5: self.__name = newName else: print("Error:輸入的名字長度不夠") xiaoming = Person("Se7eN") print("------立刻刪除xiaoming------") del xiaoming laowang = Person("laowang") laowang2 = laowang laowang3 = laowang print("------立刻刪除laowang------") del laowang print("------立刻刪除laowang2------") del laowang2 print("------立刻刪除laowang3------") del laowang3

運行結果爲:

__init__方法被調用
------立刻刪除xiaoming------
__del__方法被調用
__init__方法被調用
------立刻刪除laowang------
------立刻刪除laowang2------
------立刻刪除laowang3------
__del__方法被調用

說明:

  • 當有1個變量保存了對象的引用時,此對象的引用計數就會加1
  • 當使用del刪除變量指向的對象時,若是對象的引用計數不爲1,好比3,那麼此時只會讓這個對象的引用計數減1,即變爲2,當再次調用del時,變爲1,若是在調用1次的時候,此時纔會把對象刪除
相關文章
相關標籤/搜索