day6面向對象

来源:http://www.cnblogs.com/gengcx/archive/2017/07/28/7242816.html
-Advertisement-
Play Games

面向對象介紹(http://www.cnblogs.com/alex3714/articles/5188179.htm) 世界萬物,皆可分類 世界萬物,皆為對象 只要是對象,就肯定術語某種類 (1)特性 封裝、繼承、多態 Encapsulation 封裝 在類中對數據的賦值、內部調用對外部用戶是透明 ...


面向對象介紹(http://www.cnblogs.com/alex3714/articles/5188179.htm)

    世界萬物,皆可分類

    世界萬物,皆為對象

    只要是對象,就肯定術語某種類

  (1)特性    封裝、繼承、多態

    Encapsulation 封裝
    在類中對數據的賦值、內部調用對外部用戶是透明的,這使類變成了一個膠囊或容器,裡面包含著類的數據和方法

    Inheritance 繼承
  一個類可以派生出子類,在這個父類里定義的屬性、方法自動被子類繼承

    Polymorphism 多態
  多態是面向對象的重要特性,簡單點說:“一個介面,多種實現”,指一個基類中派生出了不同的子類,且每個子類在繼承了同樣的方法名的同時又對父類的方法做了不同的實現,這就是同一種事物表現出的多種形態。
    編程其實就是一個將具體世界進行抽象化的過程,多態就是抽象化的一種體現,把一系列具體事物的共同點抽象出來, 再通過這個抽象的事物, 與不同的具體事物進行對話。
  對不同類的對象發出相同的消息將會有不同的行為。比如,你的老闆讓所有員工在九點鐘開始工作, 他只要在九點鐘的時候說:“開始工作”即可,而不需要對銷售人員說:“開始銷售工作”,對技術人員說:“開始技術工作”, 因為“員工”是一個抽象的事物, 只要是員工就可以開始工作,他知道這一點就行了。至於每個員工,當然會各司其職,做各自的工作。
多態允許將子類的對象當作父類的對象使用,某父類型的引用指向其子類型的對象,調用的方法是該子類型的方法。這裡引用和調用方法的代碼編譯前就已經決定了,而引用所指向的對象可以在運行期間動態綁定

    class

    object

 

    (2)語法    屬性、方法、構造函數、析構函數

    私有方法,私有屬性

    創建類,並實例化兩個對象 

class Role(object):
    '''創建一個角色的類'''
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        '''初始化變數'''
        self.name = name      #實例變數(靜態屬性)
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def shot(self):                         #方法(動態屬性)
        print("shotting.......")

    def get_shot(self):
        print("ah....,I got shot......")

    def buy_gun(self,gun_name):
        print("%s just bougnt %s" %(self.name,gun_name))

r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
r2 = Role("jack","terroist","B15")   #生成一個角色
r1.buy_gun("AK47")

 

    把一個類變成一個具體對象的過程叫實例化。

    __init__(self):構造函數,作用是在實例化時做一些類的初始化工作。

    r1 = Role("alex","police","AK47") #實例化,又可以稱為初始化分類Role("alex","police","AK47")是一樣的,賦給一個變數的目的是防止被銷毀,python的記憶體回收機制,如果沒有變數,開闢的記憶體將會被回收。

    調用r1 = Role("alex","police","AK47")等價於Role(r1,"alex","police","AK47")其中,self相當於r1,把r1當做參數傳進去了。

   

    上面實例化過程中,self相當於r1,self.name等價於r1.name。每次實例化,都會把實例化的名字傳進去,r1 = Role("alex","police","AK47") 》Role(r1,"alex","police","AK47"), r2 = Role("jack","terroist","B15")》Role(r2,"jack","terroist","B15")

 

  r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
  r2 = Role("jack","terroist","B15") #生成一個角色
  r1.buy_gun("AK47")
r2.get_shot() #調用r2相當於Role.get_shot(r2)

 

     上面調用的過程中,r2.get_shot()相當於Role.get_shot(r2)。實例變數的作用域就是實例本身。

    類中的函數叫方法;

    類變數和實例變數的方法:

class Role(object):
    '''創建一個角色的類'''
    n = 123    #類的變數,存在類的記憶體中
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        '''初始化變數'''
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def shot(self):
        print("shotting.......")

    def get_shot(self):
        print("ah....,I got shot......")

    def buy_gun(self,gun_name):
        print("%s just bougnt %s" %(self.name,gun_name))

# r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
# r2 = Role("jack","terroist","B15")   #生成一個角色

print(Role.n)

    上面代碼中,我們給類添加了一個變數n,可以發現,我們沒有創建實例,就可以調用,說明n是存在類變數中的。

    下麵創建實例,看是否可以調用:

class Role(object):
    '''創建一個角色的類'''
    n = 123    #類的變數,存在類的記憶體中
    name = "我是類name"
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        '''初始化變數'''
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def shot(self):
        print("shotting.......")

    def get_shot(self):
        print("ah....,I got shot......")

    def buy_gun(self,gun_name):
        print("%s just bougnt %s" %(self.name,gun_name))

r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
r2 = Role("jack","terroist","B15")   #生成一個角色

print(Role.n)
print("r1.n:",r1.n)

    上面,實例裡面不包含n,但是也可以了,說明實例沒有這個變數會去類裡面找。

    現在我們創建了一個name的類變數,由於實例裡面也包含name屬性。看是調用那個方法。

class Role(object):
    '''創建一個角色的類'''
    n = 123    #類的變數,存在類的記憶體中
    name = "我是類name"
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        '''初始化變數'''
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def shot(self):
        print("shotting.......")

    def get_shot(self):
        print("ah....,I got shot......")

    def buy_gun(self,gun_name):
        print("%s just bougnt %s" %(self.name,gun_name))

r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
r2 = Role("jack","terroist","B15")   #生成一個角色

print(Role.n)
print("r1.n:",r1.n)
print("r1.name:",r1.name)
運行結果如下
123
r1.n: 123
r1.name: alex

    從上面代碼可以看出,先去實例裡面找變數,如果沒有才會去類中進行查找。

    下麵給類修改變數。

   

class Role(object):
    '''創建一個角色的類'''
    n = 123    #類的變數,存在類的記憶體中
    name = "我是類name"
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        '''初始化變數'''
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def shot(self):
        print("shotting.......")

    def get_shot(self):
        print("ah....,I got shot......")

    def buy_gun(self,gun_name):
        print("%s just bougnt %s" %(self.name,gun_name))

r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
r1.name = "chenronghua"     #給實例修改名字
r2 = Role("jack","terroist","B15")   #生成一個角色
r2.name = "小豬豬"    #給實例重新進行賦值

print(Role.n)
print("r1.n:",r1.n)
print("r1.name:",r1.name)
運行結果如下:
123
r1.n: 123
r1.name: chenronghua

 

    從上面可以看出,實例化之後,我們可以給實例化的變數重新賦值,修改裡面的值。

    下麵我們給實例本身添加一個新的屬性:  

class Role(object):
    '''創建一個角色的類'''
    n = 123    #類的變數,存在類的記憶體中
    name = "我是類name"
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        '''初始化變數'''
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def shot(self):
        print("shotting.......")

    def get_shot(self):
        print("ah....,I got shot......")

    def buy_gun(self,gun_name):
        print("%s just bougnt %s" %(self.name,gun_name))

r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
r1.name = "chenronghua"
r1.bullet_vests = True       #屬性不存在,重新創建一個屬性
r2 = Role("jack","terroist","B15")   #生成一個角色
r2.name = "小豬豬"

print("bullet_vests",r1.bullet_vests)
print("r2.bullet_vests:",r2.bullet_vests)
運行結果如下:
bullet_vests True
Traceback (most recent call last):
  File "/home/zhuzhu/第六天/CF.py", line 29, in <module>
    print("r2.bullet_vests:",r2.bullet_vests)
AttributeError: 'Role' object has no attribute 'bullet_vests

    上面,我們給r1實例創建了一個bullet_vests的新屬性,可以看出,能夠給實例r1創建新的屬性,創建的屬性r2實例是不具備的。

    下麵來刪除實例裡面的變數:刪除r1實例中的weapon

   

class Role(object):
    '''創建一個角色的類'''
    n = 123    #類的變數,存在類的記憶體中
    name = "我是類name"
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        '''初始化變數'''
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def shot(self):
        print("shotting.......")

    def get_shot(self):
        print("ah....,I got shot......")

    def buy_gun(self,gun_name):
        print("%s just bougnt %s" %(self.name,gun_name))

r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
r1.name = "chenronghua"
del r1.weapon      #刪除實例r1中的weapon
r2 = Role("jack","terroist","B15")   #生成一個角色
r2.name = "小豬豬"

print(r2.weapon)
print(r1.weapon)
運行結果如下:
B15
Traceback (most recent call last):
  File "/home/zhuzhu/第六天/CF.py", line 29, in <module>
    print(r1.weapon)
AttributeError: 'Role' object has no attribute 'weapon

    從運行結果可以看出,刪除實例r1中的weapon之後,實例r2中的weapon不受影響,但是實例r1中的weapon不存在了。

    如果我們刪除Role類中的weapon,那麼肯定r1.weapon和r2.weapon都不能調用。

    下麵來看一下,實例裡面是否可以修改類變數:

class Role(object):
    '''創建一個角色的類'''
    n = 123    #類的變數,存在類的記憶體中
    name = "我是類name"
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        '''初始化變數'''
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def shot(self):
        print("shotting.......")

    def get_shot(self):
        print("ah....,I got shot......")

    def buy_gun(self,gun_name):
        print("%s just bougnt %s" %(self.name,gun_name))

r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
r1.name = "chenronghua"
r1.n = "666可以改嗎"       #修改類中的變數,看是否可以成功
r2 = Role("jack","terroist","B15")   #生成一個角色
r2.name = "小豬豬"

print("r1.n:",r1.n)
print("r2.n:",r2.n)
運行結果如下:
r1.n: 666可以改嗎
r2.n: 123

    從上面代碼可以看出,r1.n="666可以改嗎"等於在實例r1中重新創建了一個變數n,因為實例r1中不存在n,不影響類本身Role.n中的值。

    類記憶體和類生成的實例記憶體。

    類變數的用途?大家共用的屬性,節省開銷。比如防彈衣,預設是沒有穿防彈衣的,我們可以在類中定義一個bullet_vests="",這樣,每個人都具有了防彈衣的屬性。當某人買了放單衣的時候,直接r1.bullet_vests=True即可。雖然可以在屬性裡面定義,但是這樣每個屬性裡面都創建了bullet_vests,浪費了記憶體。在類中只需創建一次即可。

    析構函數

    析構函數:在實例釋放、銷毀的時候執行的,通常用於做一些收尾工作,如關閉一些資料庫鏈接,打開的臨時文件,可以在裡面進行操作。

    

class Role(object):
    '''創建一個角色的類'''
    n = 123    #類的變數,存在類的記憶體中
    name = "我是類name"
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        '''初始化變數'''
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def __del__(self):     #不需要傳參數,實例結束之後自動執行,不用調用直接執行    析構函數
        print("%s 徹底死了" %self.name)

    def shot(self):
        print("shotting.......")

    def get_shot(self):
        print("ah....,I got shot......")

    def buy_gun(self,gun_name):
        print("%s just bougnt %s" %(self.name,gun_name))

r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
r1.name = "chenronghua"
r1.n = "666可以改嗎"
r2 = Role("jack","terroist","B15")   #生成一個角色
r2.name = "不努力"


r1.get_shot()
r2.shot()
運行結果如下:
ah....,I got shot......
shotting.......
chenronghua 徹底死了
不努力 徹底死了

    從上面代碼可以看出,__del__析構函數在程式退出的時候自動執行。就是在我們運行玩類之後,自動銷毀變數。是在所有調用結束不使用的時候才銷毀的。

    __del__析構函數不需要自己調用,在程式調用結束後自動執行。

    私有方法,私有屬性

    私有方法,私有屬性:就是只能內部訪問,外部訪問不了。

    比如上面類中的self.life_value屬性,我們知道,任何人執行程式都可以調用r1.life_value=0,直接讓生命值變為0,如下:

class Role(object):
    '''創建一個角色的類'''
    n = 123    #類的變數,存在類的記憶體中
    name = "我是類name"
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        '''初始化變數'''
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def __del__(self):     #不需要傳參數,實例結束之後自動執行,不用調用直接執行
        print("%s 徹底死了" %self.name)

    def shot(self):
        print("shotting.......")

    def get_shot(self):
        print("ah....,I got shot......")

    def buy_gun(self,gun_name):
        print("%s just bougnt %s" %(self.name,gun_name))

r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
r2 = Role("jack","terroist","B15")   #生成一個角色

print("modify before:",r1.life_value)
r1.life_value = 0
print("modify after:",r1.life_value)
運行結果如下:
modify before: 100
modify after: 0
alex 徹底死了
jack 徹底死了

 

    從上面代碼可以看出,開始的時候r1.life_value生命值是100滿的,但是我們修改了生命值,直接讓生命值變成0;可以看出,生命值直接改變了。假如是一款游戲的話,上來直接別人修改生命值就掛了,還沒有摸過女生的屁股就死了,這他媽也太冤枉了吧。所以,這樣肯定是不行的,不能讓外部調用機密的屬性,只能在內部進行調用。如下:

class Role(object):
    '''創建一個角色的類'''
    n = 123    #類的變數,存在類的記憶體中
    name = "我是類name"
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        '''初始化變數'''
        self.name = name
        self.role = role
        self.weapon = weapon
        self.__life_value = life_value
        self.money = money

    # def __del__(self):     #不需要傳參數,實例結束之後自動執行,不用調用直接執行
    #     print("%s 徹底死了" %self.name)

    def show_status(self):
        print("name:%s weapon:%s life_value:%s" %(self.name,self.weapon,self.__life_value))

    def shot(self):
        print("shotting.......")

    def get_shot(self):
        print("ah....,I got shot......")

    def buy_gun(self,gun_name):
        print("%s just bougnt %s" %(self.name,gun_name))

r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
r2 = Role("jack","terroist","B15")   #生成一個角色
print(r1.__life_value)
運行結果如下:
Traceback (most recent call last):
  File "/home/zhuzhu/第六天/CF.py", line 30, in <module>
    print(r1.__life_value)
AttributeError: 'Role' object has no attribute '__life_value'

 

    從上面運行結果可以看出,當我們把變數life_value設置為私有變數__life_value的時候,外部是不能夠調用的。錯誤提示是:Role類中沒有__life_value屬性。

    既然私有屬性不能在外部調用,那麼我們就在程式內部調用。

class Role(object):
    '''創建一個角色的類'''
    n = 123    #類的變數,存在類的記憶體中
    name = "我是類name"
    def __init__(self,name,role,weapon,life_value=100,money=15000):
        '''初始化變數'''
        self.name = name
        self.role = role
        self.weapon = weapon
        self.__life_value = life_value
        self.money = money

    # def __del__(self):     #不需要傳參數,實例結束之後自動執行,不用調用直接執行
    #     print("%s 徹底死了" %self.name)

    def show_status(self):
        '''通過內部調用私有屬性'''
        self.__life_value -= 50
        print("name:%s weapon:%s life_value:%s" %(self.name,self.weapon,self.__life_value))

    def shot(self):
        print("shotting.......")

    def get_shot(self):
        print("ah....,I got shot......")

    def buy_gun(self,gun_name):
        print("%s just bougnt %s" %(self.name,gun_name))

r1 = Role("alex","police","AK47")    #實例化,又可以稱為初始化分類
r2 = Role("jack","terroist","B15")   #生成一個角色
r1.show_status()     #通過函數內部調用私有屬性
運行結果如下:
name:alex weapon:AK47 life_value:50

    上面代碼,我們在類內部新增了一個方法,用來調用私有屬性,可以看出,在內部是可以調用私有屬性的。並且能夠正常調用執行私有屬性。

    因此,私有屬性是能夠調用的,只是需要在程式內部執行。在外部是不能調用的。這種情況適用於很多時候,比如我們不希望別人查看我們的密碼,銀行賬號,一些私有的屬性,都可以通過設置這種私有屬性的方法來規避。

    也可以設置私有方法,只需要在前面添加__get_shot(self)就設置了一個私有方法,私有方法在外部是不能夠調用的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、使用工具 代碼編寫:NotePad++,代碼編譯器:MASM 2、一個源程式從寫出到執行的過程 第一步,使用文本編輯器,用彙編語言編寫彙編源程式,這一步產生一個存儲源程式的文本文件。 第二步,對源程式進行編譯,連接。使用MASM.exe對源程式文件進行編譯,產生目標文件,再使用LINK.exe對 ...
  • Java解析OFFICE(word,excel,powerpoint)以及PDF的實現方案及開發中的點滴分享 在此,先分享下寫此文前的經歷與感受,我所有的感覺濃縮到一個字,那就是:"坑",如果是兩個字那就是"巨坑"=>因為這個需求一開始並不是這樣子的,且聽我漫漫道來: 一開始客戶與我們商量的是將of ...
  • ResNet(Residual Neural Network),微軟研究院 Kaiming He等4名華人提出。通過Residual Unit訓練152層深神經網路,ILSVRC 2015比賽冠軍,3.57% top-5錯誤率,參數量比VGGNet低,效果非常突出。ResNet結構,極快加速超深神經 ...
  • 1 # 字典的每一個元素都是一個鍵值對 2 user_info = { 3 "name":"alex", 4 "age":73, 5 "gender":"M", 6 } 7 8 # 索引 9 print(user_info['name']) 10 11 #輸出所有的key為一個列表 12 print... ...
  • 在kotlin中一個變數如果可修改則申明為var,只讀則申明為val,這大家都知道,但是有個小問題不禁讓我陷入了沉思…… 這const修飾符是幹啥用的?跟其他語言比一下,const就是代表不可修改,然而val已經能表達出類似的意思了呢。 查看kotlin in action,pdf文檔裡面介紹con ...
  • import hashlib def md5(arg):#這是加密函數 md5_pwd = hashlib.md5(bytes('meac',encoding='utf-8')) md5_pwd.update(bytes(arg,encoding='utf-8')) return md5_pwd.h... ...
  • 操作系統 : CentOS7.3.1611_x64 python版本:2.7.5 sklearn版本:0.18.2 tensorflow版本 :1.2.1 線性回歸是利用數理統計中回歸分析, 來確定兩種或兩種以上變數間相互依賴的定量關係的一種統計分析方法, 運用十分廣泛。 其表達形式為y = w'x ...
  • 分支結構:有條件的執行某語句,並非每句必走 1)if結構:1條路 2)if...else結構:2條路 3)if...else if結構:多條路 4)switch...case結構:多條路 優點:效率高、結構清晰 缺點:整數、相等 break:跳出switch 一、if結構的認識 /* * 1.if結 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...