第036講:類和物件:給大家介紹物件
目錄
0. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!
2. 如果我們定義了一個貓類,那你能想象出由“貓”類例項化的物件有哪些?
3. 類的定義有些時候或許不那麼“擬物”,有時候會抽象一些,例如我們定義一個矩形類,那你會為此新增哪些屬性和方法呢?
0. 按照以下提示嘗試定義一個 Person 類並生成類例項物件。
0. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!
(一)物件
這節課給大家介紹物件。我們之前說過Python無處不物件,Python到處都是物件,然而我們很多人不理解物件到底是什麼?他們只是在學習的時候有聽過面向物件程式設計這麼一回事,但是他們仍然在使用物件。
物件是模擬真實世界,把資料和程式碼都封裝在一起。
下面是關於類的一個簡單的例子:
class Turtle: #Python中的類名約定以大寫字母開頭 "-----關於類的一個簡單例子----" #屬性 color = 'green' weight = 10 legs = 4 shell = True mouth = '大嘴' #方法 def climb(self): print('我正在努力地向前爬.......') def run(self): print('我正在努力地向前爬.......') def bite(self): print('咬死你咬死你!!!') def eat(self): print('有吃的,真滿足^_^') def sleep(self): print('累了,困了,睡覺了zzzzz')
上面的語句就定義好了一個類。
tt = Turtle() #例項化一個類物件
呼叫類和呼叫函式相同,Python的類名以大寫字母開頭,函式以小寫字母開頭,方便區分。
這裡例項化了一個物件,並用 tt 這個變數給指過去,下面的語句用於呼叫物件裡的方法:
>>> tt.climb()
我正在努力地向前爬.......
>>> tt.bite()
咬死你咬死你!!!
(二)面向物件的特徵
OO = Object Oriented(面向物件)
Python就是一門純粹的面向物件程式設計的語言,面向物件程式設計有什麼特徵呢?
- 第一個特徵就是封裝
表面上看,物件封裝了屬性(也就是變數)和方法(也就是函式),成為了一個獨立性很強的模組,封裝更是一種資訊隱蔽技術,使得我們的資料更加安全,舉例說明:
Python的列表實際上就是一個物件,它提供了若干種方法供我們根據需求來調整整個列表,但是我們知道列表物件裡邊的這些方法是如何實現的嗎?我們不知道。我們也不知道列表物件裡有哪些變數。這就是所謂的封裝,它封裝起來,只給我們需要的方法的名字,然後我們呼叫這個名字,知道它可以實現就OK了。但是不會告訴我們具體的實現過程。
- 第二個特徵就是繼承
繼承是子類自動共享父類之間資料和方法的機制。
定義子類的方法為:class 子類名 (父類名):
>>> class Mylist(list):
pass
>>> list1 = Mylist()
>>> list1.append(5)
>>> list1.append(3)
>>> list1.append(7)
>>> list1
[5, 3, 7]
>>> list1.sort()
>>> list1
[3, 5, 7]
這裡我們自定義一個 list 的子類 Mylist,我們發現子類 Mylist 也能呼叫父類 list 的方法。
- 第三個特徵就是多型
多型的概念是不同物件對同一方法響應不同的行動。
>>> class A:
def fun(self):
print('我是小A')
>>> class B:
def fun(self):
print('我是小B')
>>> a = A()
>>> b = B()
>>> a.fun()
我是小A
>>> b.fun()
我是小B
測試題
0. 物件中的屬性和方法,在程式設計中實際是什麼?
答:變數(屬性)和函式(方法)。
1. 類和物件是什麼關係呢?
答:類和物件的關係就如同模具和用這個模具製作出的物品之間的關係。一個類為它的全部物件給出了一個統一的定義,而他的每個物件則是符合這種定義的一個實體,因此類和物件的關係就是抽象和具體的關係。
2. 如果我們定義了一個貓類,那你能想象出由“貓”類例項化的物件有哪些?
答:叮噹貓,咖啡貓,Tom(Tom&Jerry),Kitty(Hello Kitty)……
3. 類的定義有些時候或許不那麼“擬物”,有時候會抽象一些,例如我們定義一個矩形類,那你會為此新增哪些屬性和方法呢?
答:屬性可以是長和寬,方法可以是計算周長、面積等。
4. 類的屬性定義應該儘可能抽象還是儘可能具體?
答:正確的做法是應該儘可能的抽象,因為這樣更符合面向物件的思維。
5. 請用一句話概括面向物件的幾個特徵?
封裝 | 對外部隱藏物件的工作細節 |
繼承 | 子類自動共享父類之間資料和方法的機制 |
多型 | 可以對不同類的物件呼叫相同的方法,產生不同的結果 |
6. 函式和方法有什麼區別?
答:細心的童鞋會發現,方法跟函式其實幾乎完全一樣,但有一點區別是方法預設有一個 self 引數,這個引數是什麼意思?請聽下一講詳細分解。
動動手
0. 按照以下提示嘗試定義一個 Person 類並生成類例項物件。
屬性:姓名(預設姓名為“小甲魚”)
方法:列印姓名
提示:方法中對屬性的引用形式需加上 self,如 self.name
class Person:
name = '小甲魚'
def printName(self):
print(self.name)
1. 按照以下提示嘗試定義一個矩形類並生成類例項物件。
屬性:長和寬
方法:設定長和寬 -> setRect(self),獲得長和寬 -> getRect(self),獲得面積 -> getArea(self)
提示:方法中對屬性的引用形式需加上 self,如 self.width
程式截圖:
class Rectangle:
length = 5
width = 4
def setRect(self):
print("請輸入矩形的長和寬...")
self.length = float(input('長:'))
self.width = float(input('寬:'))
def getRect(self):
print('這個矩形的長是:%.2f,寬是:%.2f' % (self.length, self.width))
def getArea(self):
return self.length * self.width