1. 程式人生 > >第036講:類和物件:給大家介紹物件

第036講:類和物件:給大家介紹物件

目錄

0. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

測試題

0. 物件中的屬性和方法,在程式設計中實際是什麼?

1. 類和物件是什麼關係呢?

2. 如果我們定義了一個貓類,那你能想象出由“貓”類例項化的物件有哪些?

3. 類的定義有些時候或許不那麼“擬物”,有時候會抽象一些,例如我們定義一個矩形類,那你會為此新增哪些屬性和方法呢?

4. 類的屬性定義應該儘可能抽象還是儘可能具體?

5. 請用一句話概括面向物件的幾個特徵?

6. 函式和方法有什麼區別?

動動手

0. 按照以下提示嘗試定義一個 Person 類並生成類例項物件。

1. 按照以下提示嘗試定義一個矩形類並生成類例項物件。


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