成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

09-02封裝-創(chuàng)新互聯(lián)

[TOC]

在網(wǎng)站制作、成都做網(wǎng)站中從網(wǎng)站色彩、結(jié)構(gòu)布局、欄目設(shè)置、關(guān)鍵詞群組等細(xì)微處著手,突出企業(yè)的產(chǎn)品/服務(wù)/品牌,幫助企業(yè)鎖定精準(zhǔn)用戶,提高在線咨詢和轉(zhuǎn)化,使成都網(wǎng)站營銷成為有效果、有回報(bào)的無錫營銷推廣。創(chuàng)新互聯(lián)專業(yè)成都網(wǎng)站建設(shè)10余年了,客戶滿意度97.8%,歡迎成都創(chuàng)新互聯(lián)客戶聯(lián)系。

一 引入

? 面向?qū)ο缶幊逃腥筇匦裕悍庋b、繼承、多態(tài),其中最重要的一個(gè)特性就是封裝。封裝指的就是把數(shù)據(jù)與功能都整合到一起,聽起來是不是很熟悉,沒錯(cuò),我們之前所說的”整合“二字其實(shí)就是封裝的通俗說法。除此之外,針對(duì)封裝到對(duì)象或者類中的屬性,我們還可以嚴(yán)格控制對(duì)它們的訪問,分兩步實(shí)現(xiàn):隱藏與開放接口

插圖:惡搞圖16
09-02 封裝

二 隱藏屬性

Python的Class機(jī)制采用雙下劃線開頭的方式將屬性隱藏起來(設(shè)置成私有的),但其實(shí)這僅僅只是一種變形操作,類中所有雙下滑線開頭的屬性都會(huì)在類定義階段、檢測(cè)語法時(shí)自動(dòng)變成“_類名__屬性名”的形式:

class Foo:
    __N=0 # 變形為_Foo__N

    def __init__(self): # 定義函數(shù)時(shí),會(huì)檢測(cè)函數(shù)語法,所以__開頭的屬性也會(huì)變形
        self.__x=10 # 變形為self._Foo__x

    def __f1(self): # 變形為_Foo__f1
        print('__f1 run')

    def f2(self):  # 定義函數(shù)時(shí),會(huì)檢測(cè)函數(shù)語法,所以__開頭的屬性也會(huì)變形
        self.__f1() #變形為self._Foo__f1()

print(Foo.__N) # 報(bào)錯(cuò)AttributeError:類Foo沒有屬性__N

obj = Foo()
print(obbj.__x) # 報(bào)錯(cuò)AttributeError:對(duì)象obj沒有屬性__x

插圖:惡搞圖17
09-02 封裝

這種變形需要注意的問題是:

1、在類外部無法直接訪問雙下滑線開頭的屬性,但知道了類名和屬性名就可以拼出名字:_類名_屬性,然后就可以訪問了,如Foo._A\_N,所以說這種操作并沒有嚴(yán)格意義上地限制外部訪問,僅僅只是一種語法意義上的變形。

>>> Foo.__dict__
mappingproxy({..., '_Foo__N': 0, ...})

>>> obj.__dict__
{'_Foo__x': 10}

>>> Foo._Foo__N
0
>>> obj._Foo__x
10
>>> obj._Foo__N
0

2、在類內(nèi)部是可以直接訪問雙下滑線開頭的屬性的,比如self.__f1(),因?yàn)樵陬惗x階段類內(nèi)部雙下滑線開頭的屬性統(tǒng)一發(fā)生了變形。

>>> obj.f2()
__f1 run

3、變形操作只在類定義階段發(fā)生一次,在類定義之后的賦值操作,不會(huì)變形。

>>> Foo.__M=100
>>> Foo.__dict__
mappingproxy({..., '__M': 100,...})
>>> Foo.__M
100

>>> obj.__y=20
>>> obj.__dict__
{'__y': 20, '_Foo__x': 10}
>>> obj.__y
20

插圖:惡搞圖18
09-02 封裝

三 開放接口

定義屬性就是為了使用,所以隱藏并不是目的

3.1 隱藏?cái)?shù)據(jù)屬性

將數(shù)據(jù)隱藏起來就限制了類外部對(duì)數(shù)據(jù)的直接操作,然后類內(nèi)應(yīng)該提供相應(yīng)的接口來允許類外部間接地操作數(shù)據(jù),接口之上可以附加額外的邏輯來對(duì)數(shù)據(jù)的操作進(jìn)行嚴(yán)格地控制

>>> class Teacher:
...     def __init__(self,name,age): #將名字和年紀(jì)都隱藏起來
...         self.__name=name
...         self.__age=age
...     def tell_info(self): #對(duì)外提供訪問老師信息的接口
...         print('姓名:%s,年齡:%s' %(self.__name,self.__age))
...     def set_info(self,name,age): #對(duì)外提供設(shè)置老師信息的接口,并附加類型檢查的邏輯
...         if not isinstance(name,str):
...             raise TypeError('姓名必須是字符串類型')
...         if not isinstance(age,int):
...             raise TypeError('年齡必須是整型')
...         self.__name=name
...         self.__age=age
... 
>>>
>>> t=Teacher('lili',18)
>>> t.set_info(‘LiLi','19') # 年齡不為整型,拋出異常
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 11, in set_info
TypeError: 年齡必須是整型
>>> t.set_info('LiLi',19) # 名字為字符串類型,年齡為整形,可以正常設(shè)置
>>> t.tell_info() # 查看老師的信息
姓名:LiLi,年齡:19

插圖:惡搞圖19
09-02 封裝

3.2 隱藏函數(shù)屬性

目的的是為了隔離復(fù)雜度,例如ATM程序的取款功能,該功能有很多其他功能組成,比如插卡、身份認(rèn)證、輸入金額、打印小票、取錢等,而對(duì)使用者來說,只需要開發(fā)取款這個(gè)功能接口即可,其余功能我們都可以隱藏起來

>>> class ATM:
...     def __card(self): #插卡
...         print('插卡')
...     def __auth(self): #身份認(rèn)證
...         print('用戶認(rèn)證')
...     def __input(self): #輸入金額
...         print('輸入取款金額')
...     def __print_bill(self): #打印小票
...         print('打印賬單')
...     def __take_money(self): #取錢
...         print('取款')
...     def withdraw(self): #取款功能
...         self.__card()
...         self.__auth()
...         self.__input()
...         self.__print_bill()
...         self.__take_money()
...
>>> obj=ATM()
>>> obj.withdraw()

插圖:惡搞圖20
09-02 封裝

總結(jié)隱藏屬性與開放接口,本質(zhì)就是為了明確地區(qū)分內(nèi)外,類內(nèi)部可以修改封裝內(nèi)的東西而不影響外部調(diào)用者的代碼;而類外部只需拿到一個(gè)接口,只要接口名、參數(shù)不變,則無論設(shè)計(jì)者如何改變內(nèi)部實(shí)現(xiàn)代碼,使用者均無需改變代碼。這就提供一個(gè)良好的合作基礎(chǔ),只要接口這個(gè)基礎(chǔ)約定不變,則代碼的修改不足為慮。

四 property

BMI指數(shù)是用來衡量一個(gè)人的體重與身高對(duì)健康影響的一個(gè)指標(biāo),計(jì)算公式為

09-02 封裝

體質(zhì)指數(shù)(BMI)=體重(kg)÷身高^2(m)
EX:70kg÷(1.75×1.75)=22.86

身高或體重是不斷變化的,因而每次想查看BMI值都需要通過計(jì)算才能得到,但很明顯BMI聽起來更像是一個(gè)特征而非功能,為此Python專門提供了一個(gè)裝飾器property,可以將類中的函數(shù)“偽裝成”對(duì)象的數(shù)據(jù)屬性,對(duì)象在訪問該特殊屬性時(shí)會(huì)觸發(fā)功能的執(zhí)行,然后將返回值作為本次訪問的結(jié)果,例如

>>> class People:
...     def __init__(self,name,weight,height):
...         self.name=name
...         self.weight=weight
...         self.height=height
...     @property
...     def bmi(self):
...         return self.weight / (self.height**2)
...
>>> obj=People('lili',75,1.85)
>>> obj.bmi #觸發(fā)方法bmi的執(zhí)行,將obj自動(dòng)傳給self,執(zhí)行后返回值作為本次引用的結(jié)果
21.913805697589478

插圖:惡搞圖21
09-02 封裝

使用property有效地保證了屬性訪問的一致性。另外property還提供設(shè)置和刪除屬性的功能,如下

>>> class Foo:
...     def __init__(self,val):
...         self.__NAME=val #將屬性隱藏起來
...     @property
...     def name(self):
...         return self.__NAME
...     @name.setter
...     def name(self,value):
...         if not isinstance(value,str):  #在設(shè)定值之前進(jìn)行類型檢查
...             raise TypeError('%s must be str' %value)
...         self.__NAME=value #通過類型檢查后,將值value存放到真實(shí)的位置self.__NAME
...     @name.deleter
...     def name(self):
...         raise PermissionError('Can not delete')
...
>>> f=Foo('lili')
>>> f.name
lili
>>> f.name='LiLi' #觸發(fā)name.setter裝飾器對(duì)應(yīng)的函數(shù)name(f,’Egon')
>>> f.name=123 #觸發(fā)name.setter對(duì)應(yīng)的的函數(shù)name(f,123),拋出異常TypeError
>>> del f.name #觸發(fā)name.deleter對(duì)應(yīng)的函數(shù)name(f),拋出異常PermissionError

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)頁標(biāo)題:09-02封裝-創(chuàng)新互聯(lián)
網(wǎng)站鏈接:http://jinyejixie.com/article16/djshgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、ChatGPT響應(yīng)式網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)定制網(wǎng)站、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作
绥阳县| 来凤县| 祁阳县| 嘉禾县| 平远县| 汽车| 大竹县| 突泉县| 张家界市| 青铜峡市| 抚州市| 内黄县| 卢湾区| 井研县| 霞浦县| 深泽县| 三台县| 石狮市| 鸡泽县| 琼海市| 鸡西市| 双峰县| 山阴县| 成武县| 当雄县| 临西县| 随州市| 浏阳市| 湖州市| 绵阳市| 钦州市| 祁东县| 阿尔山市| 唐河县| 宜丰县| 电白县| 周口市| 青州市| 鸡东县| 玛多县| 虞城县|