中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

面向?qū)ο?封裝-創(chuàng)新互聯(lián)

1.設(shè)置私有變量和函數(shù)

1.1變量和函數(shù)的隱藏

python中用雙下劃線開頭的方式把屬性隱藏起來(設(shè)置成私有的)

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),措勤企業(yè)網(wǎng)站建設(shè),措勤品牌網(wǎng)站建設(shè),網(wǎng)站定制,措勤網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,措勤網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
#其實這僅僅這是一種變形操作
#類中所有雙下劃線開頭的名稱如__x都會自動變形成:_類名__x的形式:

class A:
    __N=0 #類的數(shù)據(jù)屬性就應(yīng)該是共享的,但是語法上是可以把類的數(shù)據(jù)屬性設(shè)置成私有的如__N,會變形為_A__N
    def __init__(self):
        self.__X=10 #類定義時就變形為self._A__X
    def __foo(self): #類定義時就變形為_A__foo
        print('from A')
    def bar(self):
        self.__foo() #只有在類內(nèi)部才可以通過__foo的形式訪問到.
a = A()
print("a.__dict__",a.__dict__)
#定義后的賦值操作,不會變形為_類名__N
a.__Y=1
print("a.__dict__",a.__dict__)
print("a._A__N:",a._A__N)
print("A._A__N:",A._A__N)
#A._A__N是可以訪問到的,即這種操作并不是嚴(yán)格意義上的限制外部訪問,僅僅只是一種語法意義上的變形

E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
a.__dict__ {'_A__X': 10}
a.__dict__ {'_A__X': 10, '__Y': 1}
a._A__N: 0
A._A__N: 0

Process finished with exit code 0
這種自動變形的特點:
1.類中定義的__x只能在內(nèi)部使用,如self.__x,引用的就是變形的效果。
2.這種變形其實是針對外部的變形,在外部是無法通過__x這個名字訪問到的。
3.在子類定義的__x不會覆蓋在父類定義的__x,
因為子類中變形成了:_子類名__x,
而父類中變形成了:_父類名__x,即雙下劃線開頭的屬性在繼承給子類時,子類時無法覆蓋的。
這種變形要注意的問題:
"1.這種機(jī)制并沒有真正意義上限制我們從外部直接訪問屬性,知道了類名和屬性名還可以拼出名字:_類名__屬性,然后就可以訪問了,如a._A__N或A._A__N"
"2.變形的過程只在類定義時發(fā)生一次,在定義后的賦值操作,不會發(fā)生變形"
print("a.__dict__",a.__dict__)
#定義后的賦值操作,不會變形為_類名__N
a.__Y=1
print("a.__dict__",a.__dict__)

a.__dict__ {'_A__X': 10}
a.__dict__ {'_A__X': 10, '__Y': 1}#這里依舊是__Y,并沒變形為_A__Y
"3.在繼承中,父類如果不想讓子類覆蓋自己的方法,可以把方法定義為私有的"

#正常情況
>>> class A:
...     def fa(self):
...         print('from A')
...     def test(self):
...         self.fa()  #這里先到對象自身的類中找,找不到再到A類中找
... 
>>> class B(A):
...     def fa(self):
...         print('from B')
... 
>>> b=B()
>>> b.test()
from B

#把fa定義成私有的,即__fa
>>> class A:
...     def __fa(self): #在定義時就變形為_A__fa
...         print('from A')
...     def test(self):
...         self.__fa() #在定義階段,變形為self._A__fa,所以只會與自己所在的類為準(zhǔn)
... 
>>> class B(A):
...     def __fa(self): #在定義階段,變形為self._B__fa
...         print('from B')
... 
>>> b=B()
>>> b.test() #注意這里調(diào)用的self.__fa()為類A中的__fa()
from A

1.2封裝不是單純意義的隱藏

1.2.1封裝數(shù)據(jù)

將數(shù)據(jù)隱藏起來不是目的。隱藏起來然后對外提供操作數(shù)據(jù)的接口,然后就可以在接口附加上對該數(shù)據(jù)操作的限制,以此完成對數(shù)據(jù)屬性操作的嚴(yán)格限制

class Teacher:
    def __init__(self,name,age):
        self.__name=name
        self.__age=age

    def tell_info(self):
        print('姓名:%s,年齡:%s' %(self.__name,self.__age))
    def set_info(self,name,age):
        if not isinstance(name,str):
            raise TypeError('姓名必須是字符串類型')
        if not isinstance(age,int):
            raise TypeError('年齡必須是整型')
        self.__name=name
        self.__age=age

t=Teacher('egon',18)
t.tell_info()

t.set_info('egon',19)
t.tell_info()

1.2.2封裝方法

目的是隔離復(fù)雜度

#取款是功能,而這個功能有很多功能組成:插卡、密碼認(rèn)證、輸入金額、打印賬單、取錢
#對使用者來說,只需要知道取款這個功能即可,其余功能我們都可以隱藏起來,很明顯這么做
#隔離了復(fù)雜度,同時也提升了安全性

class ATM:
    def __card(self):
        print('插卡')
    def __auth(self):
        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()

a=ATM()
a.withdraw()

1.3封裝與擴(kuò)展性

封裝在于明確區(qū)分內(nèi)外,使得類實現(xiàn)者可以修改封裝內(nèi)的東西而不影響外部調(diào)用者的代碼。
外部調(diào)用者只需要知道函數(shù)名,只要函數(shù)名,參數(shù)不變,使用者的代碼就不需要改變。這就提供了一個良好的合作基礎(chǔ)。

#類的設(shè)計者
class Room:
    def __init__(self,name,owner,width,length,high):
        self.name=name
        self.owner=owner
        self.__width=width
        self.__length=length
        self.__high=high
    def tell_area(self): #對外提供的接口,隱藏了內(nèi)部的實現(xiàn)細(xì)節(jié),此時我們想求的是面積
        return self.__width * self.__length

#使用者
>>> r1=Room('臥室','egon',20,20,20)
>>> r1.tell_area() #使用者調(diào)用接口tell_area

#類的設(shè)計者,輕松的擴(kuò)展了功能,而類的使用者完全不需要改變自己的代碼
class Room:
    def __init__(self,name,owner,width,length,high):
        self.name=name
        self.owner=owner
        self.__width=width
        self.__length=length
        self.__high=high
    def tell_area(self): #對外提供的接口,隱藏內(nèi)部實現(xiàn),此時我們想求的是體積,內(nèi)部邏輯變了,只需求修該下列一行就可以很簡答的實現(xiàn),而且外部調(diào)用感知不到,仍然使用該方法,但是功能已經(jīng)變了
        return self.__width * self.__length * self.__high

#對于仍然在使用tell_area接口的人來說,根本無需改動自己的代碼,就可以用上新功能
>>> r1.tell_area()

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

分享文章:面向?qū)ο?封裝-創(chuàng)新互聯(lián)
新聞來源:http://www.rwnh.cn/article16/cegdgg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、網(wǎng)站排名品牌網(wǎng)站設(shè)計、搜索引擎優(yōu)化、建站公司網(wǎng)站策劃

廣告

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

成都定制網(wǎng)站建設(shè)
阿合奇县| 友谊县| 绩溪县| 旌德县| 卫辉市| 阿拉善盟| 奉化市| 昌平区| 达州市| 济阳县| 潼关县| 汽车| 清水县| 利辛县| 南召县| 彰化市| 大埔县| 贵南县| 固阳县| 合作市| 青铜峡市| 东阿县| 辉县市| 安乡县| 闽侯县| 门源| 塔河县| 东乌珠穆沁旗| 内丘县| 舞阳县| 玉门市| 阜阳市| 怀安县| 苗栗县| 临漳县| 永和县| 驻马店市| 曲水县| 兴隆县| 五家渠市| 罗城|