Python基礎(六)

面向對象編程介紹

面向對象(object-oriented ;簡稱: OO) 至今還沒有統一的概念,我這里把它定義為: 按人們認識客觀世界的系統思維方式,采用基于對象(實體)的概念建立模型,模擬客觀世界分析、設計、實現軟件的辦法。

面向對象編程(Object Oriented Programming-OOP) 是一種解決軟件復用的設計和編程方法。這種方法把軟件系統中相近相似的操作邏輯和操作應用數據、狀態,以類的型式描述出來,以對象實例的形式在軟件系統中復用,以達到提高軟件開發效率的作用。

類和對象

面向對象編程的2個非常重要的概念:類和對象。

  • 對象是面向對象編程的核心,在使用對象的過程中,為了將具有共同特征和行為的一組對象抽象定義,提出了另外一個新的概念——類。
  • 類就相當于制造飛機時的圖紙,用它來進行創建的飛機就相當于對象。


具有相似內部狀態和運動規律的實體的集合(或統稱為抽象)。具有相同屬性和行為事物的統稱。類是抽象的,在使用的時候通常會找到這個類的一個具體的存在,使用這個具體的存在。一個類可以找到多個對象。

對象
某一個具體事物的存在 ,在現實世界中可以是看得見摸得著的,可以是直接使用的。

類和對象之間的關系
類就是創建對象的模板。

類的構成
類(Class) 由3個部分構成:

  • 類的名稱:類名
  • 類的屬性:一組數據
  • 類的方法:允許對進行操作的方法 (行為)

示例:狗類

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

類的抽象
擁有相同(或者類似)屬性和行為的對象都可以抽像出一個類。

定義類

定義一個類,格式如下:

class 類名:
方法列表

示例:定義一個Car類

# 定義類
class Car:
# 方法
def getCarInfo(self):
print('車輪子個數:%d, 顏色%s'%(self.wheelNum, self.color))

def move(self):
print("車正在移動...")

說明

  • 定義類時有2種:新式類和經典類,上面的Car為經典類,如果是Car(object)則為新式類;
  • 類名的命名規則按照"大駝峰"。

創建對象

python中,可以根據已經定義的類去創建出一個個對象。

創建對象的格式為:

對象名 = 類名()

創建對象的示例:

# 定義類
class Car:
# 移動
def move(self):
print('車在奔跑...')

# 鳴笛
def toot(self):
print("車在鳴笛...嘟嘟..")

# 創建一個對象,并用變量BMW來保存它的引用
BMW = Car()
BMW.color = '黑色'
BMW.wheelNum = 4 #輪子數量
BMW.move()
BMW.toot()
print(BMW.color)
print(BMW.wheelNum)
Car

總結

  • BMW = Car(),這樣就產生了一個Car的實例對象,此時也可以通過實例對象BMW來訪問屬性或者方法;
  • 第一次使用BMW.color = '黑色'表示給BMW這個對象添加屬性,如果后面再次出現BMW.color = xxx表示對屬性進行修改;
  • BMW是一個對象,它擁有屬性(數據)和方法(函數);
  • 當創建一個對象時,就是用一個模子,來制造一個實物 。

__ init __()方法

我們已經給BMW這個對象添加了2個屬性,wheelNum(車的輪胎數量)以及color(車的顏色),試想如果再次創建一個對象的話,肯定也需要進行添加屬性,顯然這樣做很費事,那么有沒有辦法能夠在創建對象的時候,就順便把車這個對象的屬性給設置呢?我們可以用__ init __()方法實現這一點。

使用方式

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

__init __()方法的調用

# 定義汽車類
class Car:
def __init__(self):
self.wheelNum = 4
self.color = '藍色'

def move(self):
print('車在跑,目標:夏威夷')

# 創建對象
BMW = Car()

print('車的顏色為:%s'%BMW.color)
print('車輪胎數量為:%d'%BMW.wheelNum)

結果:

車的顏色為:blue
車輪胎數量為:4

總結:
當創建Car對象后,在沒有調用__ init__()方法的前提下,BMW就默認擁有了2個屬性wheelNum和color,原因是__ init__()方法是在創建對象后,就立刻被默認調用了。

傳參
既然在創建完對象后__ init__()方法已經被默認的執行了,那么能否讓對象在調用__ init__()方法的時候傳遞一些參數呢?如果可以,那怎樣傳遞呢?

# 定義汽車類
class Car:

def __init__(self, newWheelNum, newColor):
self.wheelNum = newWheelNum
self.color = newColor

def move(self):
print('車在跑,目標:夏威夷')

# 創建對象
BMW = Car(4, 'green')

print('車的顏色為:%s'%BMW.color)
print('車輪子數量為:%d'%BMW.wheelNum)

結果:

車的顏色為:green
車輪胎數量為:4

總結:

  • __ init__()方法,在創建一個對象時默認被調用,不需要手動調用;
  • __ init__(self)中,默認有1個參數名字為self,如果在創建對象時傳遞了2個實參,那么__init __(self)中出了self作為第一個形參外還需要2個形參,例如__init __(self,x,y);
  • __ init__(self)中的self參數,不需要開發者傳遞,python解釋器會自動把當前的對象引用傳遞進去。

self

理解self
如下示例:

# 定義一個類
class Animal:

# 方法
def __init__(self, name):
self.name = name

def printName(self):
print('名字為:%s'%self.name)

# 定義一個函數
def myPrint(animal):
animal.printName()

dog1 = Animal('西西')
myPrint(dog1)

dog2 = Animal('北北')
myPrint(dog2)

運行結果:

名字為:西西
名字為:北北

總結:

  • 所謂的self,可以理解為自己;
  • 可以把self當做Java中類里面的this指針一樣理解,就是對象自身的意思;
  • 某個對象調用其方法時,python解釋器會把這個對象作為第一個參數傳遞給self,所以開發者只需要傳遞后面的參數即可。

舉個例子:老王開槍

老王開槍

人類

  • 屬性
    • 姓名
    • 血量
    • 持有的槍
  • 方法
    • 安子彈
    • 安彈夾
    • 拿槍(持有搶)
    • 開槍

子彈類

  • 屬性
    • 殺傷力
  • 方法
    • 傷害敵人(讓敵人掉血)

彈夾類

  • 屬性
    • 容量(子彈存儲的最大值)
    • 當前保存的子彈
  • 方法
    • 保存子彈(安裝子彈的時候)
    • 彈出子彈(開槍的時候)

槍類

  • 屬性
    • 彈夾(默認沒有彈夾,需要安裝)
  • 方法
    • 連接彈夾(保存彈夾)
    • 射子彈

人類實現:

class Ren:
def __init__(self,name):
self.name = name
self.xue = 100
self.qiang = None

def __str__(self):
return self.name + "剩余血量為:" + str(self.xue)

def anzidan(self,danjia,zidan):
danjia.baocunzidan(zidan)

def andanjia(self,qiang,danjia):
qiang.lianjiedanjia(danjia)

def naqiang(self,qiang):
self.qiang = qiang

def kaiqiang(self,diren):
self.qiang.she(diren)

def diaoxue(self,shashangli):
self.xue -= shashangli

彈夾類實現:

class Danjia:
def __init__(self, rongliang):
self.rongliang = rongliang
self.rongnaList = []

def __str__(self):
return "彈夾當前的子彈數量為:" + str(len(self.rongnaList)) + "/" + str(self.rongliang)

def baocunzidan(self,zidan):
if len(self.rongnaList) < self.rongliang:
self.rongnaList.append(zidan)

def chuzidan(self):
#判斷當前彈夾中是否還有子彈
if len(self.rongnaList) > 0:
#獲取最后壓入到單間中的子彈
zidan = self.rongnaList[-1]
self.rongnaList.pop()
return zidan
else:
return None

子彈類實現:

class Zidan:
def __init__(self,shashangli):
self.shashangli = shashangli

def shanghai(self,diren):
diren.diaoxue(self.shashangli)

槍類實現:

class Qiang:
def __init__(self):
self.danjia = None

def __str__(self):
if self.danjia:
return "槍當前有彈夾"
else:
return "槍沒有彈夾"

def lianjiedanjia(self,danjia):
if not self.danjia:
self.danjia = danjia

def she(self,diren):
zidan = self.danjia.chuzidan()
if zidan:
zidan.shanghai(diren)
else:
print("沒有子彈了,放了空槍....")

調用運行:

#創建一個人對象
laowang = Ren("老王")

#創建一個彈夾
danjia = Danjia(20)
print(danjia)

#循環的方式創建一顆子彈,然后讓老王把這顆子彈壓入到彈夾中
i=0
while i<5:
zidan = Zidan(5)
laowang.anzidan(danjia,zidan)
i+=1
#測試一下,安裝完子彈后,彈夾中的信息
print(danjia)

#創建一個槍對象
qiang = Qiang()
print(qiang)
#讓老王,把彈夾連接到槍中
laowang.andanjia(qiang,danjia)
print(qiang)

#創建一個敵人
diren = Ren("敵人")
print(diren)

#讓老王拿起槍
laowang.naqiang(qiang)

#老王開槍射敵人
laowang.kaiqiang(diren)
print(diren)
print(danjia)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容

  • 1.1面向對象 面向對象(object-oriented ;簡稱: OO)至今還沒有統一的概念 我這里把它定義為:...
    TENG書閱讀 574評論 0 0
  • 面向對象(Object Oriented Programming,OOP) ·1)解決菜鳥買電腦的故事 第一種方式...
    西多的大叔閱讀 400評論 0 1
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young閱讀 3,847評論 1 10
  • 不要順境的時候就得意忘形,逆境的時候又頹廢自暴自棄。 順境的時候做人也要低調謙虛求教,逆境的時候更要夾著尾巴做人,蓄力。
    秦不墮閱讀 95評論 0 0
  • 蛇鷲和老鷹都是捕蛇能手。但它倆的捕蛇方式卻截然不同,蛇鷲耐心細致,善于與蛇周旋;老鷹膽大兇猛,抓蛇時干凈利落。 一...
    牧狼天下閱讀 1,178評論 0 0