1. 程式人生 > >Python3面向物件-----------封裝

Python3面向物件-----------封裝

      以下是我對Python3面向物件------封裝的理解,因為博主也是初學Python3,有很多東西都還停留在表層的理解,如果我的部落格有任何錯誤,請及時評論或者私信我,我會及時更改。也歡迎同樣學習Python的你願意關注我的部落格,我會把我每週的學習內容進行整理和上傳,方便大家溝通和交流學習經驗。


Python面向物件---------封裝

 

        (1)面向物件:封裝  繼承  多型

 

                 什麼是面向物件?什麼是面向過程?兩者有什麼區別?


                 面向物件:注重的是設計,從設計的角度,從生活的角度設計程式碼,追求的是程式碼的擴充套件性和維護性


                 面向過程:注重的是結果,以結果的角度出發考慮問題,不關心中間的實現過程,

                                   不管用什麼方法得到結果即可


                 可以看這篇五子棋的例子輔助理解面向過程與面向物件的區別


         (2)封裝
                  什麼是封裝?


                  比函式大一點的容器叫做類(class),類這個容器中可以放很多函式和變數,

                  把同一類的函式和變數放到一個類中去的過程叫做封裝。


                  類:比較抽象化,可以比作一張圖紙或者一個模板,看不見


                  物件:是根據類(圖紙)創建出的具體的物體


                  先有類,後有物件


                  一個類可以建立無數個物件


                  物件與物件之間屬相不一定一致。


                  類是描述一類事物的,事物由屬性和行為構成  


                            屬性:這類事物的資訊(姓名,年齡,顏色,身高等) 用變量表示


                            行為:會做的的事                  用函式表示


                  所以說類也可以說是由函式和變數組成的


                  當類中沒有變數時,通過物件名,Python是可以自動創建出變數,

                  但是這個變數只能自己用。(不推薦這種方式)

 

                  怎麼寫一個類和類中的建構函式?


                            1.建立變數
                            2.初始化賦值

 

class Person:
     # 寫建構函式  init(初始化)
     # self.變數名----建立變數
     # self--自己(誰呼叫self就代表誰)
     # Person()---建構函式
     def __init__(self):
         self.name = None
         self.age = None
         self.sex = None
         print('我出生了!')
     #普通函式
     def eat(self):
         name = '李四'
         print(name,'吃飯')

#建立物件(例項化物件)
#建立物件預設呼叫建構函式
p1 = Person()
p1.name = '張三'
p1.age = 22
p1.sex = '男'
print(p1.name,p1.sex,p1.age)
p1.eat()

下邊看一個案例:

            案例要求:有一個牌庫,發牌後左右手各13張牌,實現左右手換牌。(初學簡單實現即可)
            案例分析:類:人  牌  手
                              人:屬性:左手,右手  行為:換牌
                              牌:屬性:花色,數字  行為:無
                              手:屬性:左手的牌  右手的牌   行為:無

 

#因為發牌是隨機的,所以先匯入random函式,接著根據分析分別建立類
import random
#牌類
class Card:
    def __init__(self):
        self.card_number=None
        self.card_color=None
#手類
class Hand:
    def __init__(self):
        self.card=None
#人類
class Person:
    def __init__(self):
        self.left_hand_card=None
        self.right_hand_card=None

    def changeCard(self):
        c=self.left_hand_card
        self.left_hand_card=self.right_hand_card
        self.right_hand_card=c
#牌庫(模擬隨機發13張牌)
PK = Card()
PK.card_color = ['♡','♣','♤','♢']
PK.card_number = ['A','2','3','4','5','6','7','8','9','10','J','Q','K']

r,l = Hand(),Hand()
l.card,r.card = '',''
for i in range(13):
    pai1 = random.choice(PK.card_color) + random.choice(PK.card_number) + ' '
    pai2 = random.choice(PK.card_color) + random.choice(PK.card_number) + ' '
    l.card += pai1
    r.card += pai2

p=Person()
p.left_hand_card,p.right_hand_card = l,r
print('換前')
print('左手:{},右手:{}'.format(p.left_hand_card.card,p.right_hand_card.card))
p.changeCard()
print('換後')
print('左手:{},右手:{}'.format(p.left_hand_card.card,p.right_hand_card.card))

根據這個案例,我們應該大致瞭解了Python3中封裝的基本含義和封裝的方法,其中封裝的關鍵字class建立類的時候後邊不加括號,下邊建立物件呼叫類時用需要寫括號,封裝的意思就是把一個功能打包在一起,從而讓相同功能形成一個程式碼塊,在後期的維護和擴充套件上會節省很多的時間,因為你只需把相應功能的程式碼塊(類)進行修改而不像面向過程那樣牽一髮而動全身了。

補充知識:1.建構函式加引數

                  我們知道在將一個功能寫成一個函式時,為了方便和節省程式碼,我們可以給函式定幾個形參,利用引數傳遞的方式來減少程式碼量,那麼建構函式能不能加引數呢?  當然是可以的,那麼構造引數如何加引數呢?看下面的例子:

class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
        print('%s的年齡為:%d'%(name,age))
p=Person('張三',22)

執行結果證明'張三'和年齡完成了傳遞,所以,建構函式加引數的格式為:def __init__(self,形參)。實參寫在下邊物件呼叫類的括號裡邊,可以同時傳遞多個引數,注意構造引數內的self不可省略,其餘形參一次往後邊寫,用逗號隔開。