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
將數(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()
目的是隔離復(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()
封裝在于明確區(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)