1.什么是封裝
. 裝:往容器/名稱空間里存入名字
. 封:代表將存放于名稱空間中的名字給藏起來,這種隱藏對(duì)外不對(duì)內(nèi)
2.如何封裝
在類內(nèi)定義的屬性前加兩個(gè)下劃線開頭(沒有兩個(gè)下劃線結(jié)尾)
總結(jié):
1. 兩個(gè)下劃線開頭的屬性實(shí)現(xiàn)的隱藏僅僅只是一種語法意義上的變形,并不會(huì)真的限制類外部的訪問
2. 該變形操作只在類定義階段檢測(cè)語法時(shí)發(fā)生一次,類定義階段之后新增的兩個(gè)下劃線開頭的屬性并不會(huì)變形
3. 如果父類不想讓子類覆蓋自己的屬性,可以在屬性前加兩個(gè)下劃線開頭
class Foo:
__x=111 # _Foo__x
__y=222 # _Foo__y
def __init__(self,name,age):
self.__name=name
self.__age=age
def __func(self): #_Foo__func
print('func')
def get_info(self):
print(self.__name,self.__age,self.__x)
#這里__x,__y,__func,__name,__age都被隱藏
實(shí)現(xiàn)原理:
以Foo類舉例
在類檢測(cè)語法階段,會(huì)把__開頭,不已__結(jié)尾的名字變形成(_類目__原名)
例如__x將變形成_Foo__x
類內(nèi)部的_x都會(huì)發(fā)生變形,類外部則不會(huì)變形,所以類外部無法訪問_x,從而實(shí)現(xiàn)了隱藏
驗(yàn)證:
可以在類內(nèi)部打印print(Foo.__dict__)
封裝數(shù)據(jù)屬性:將數(shù)據(jù)屬性隱藏起來,類外就無法直接操作屬性,需要類內(nèi)開辟一個(gè)接口來外部的使用可以間接地操作屬性,可以在接口內(nèi)定義任意的控制邏輯,從而嚴(yán)格控制使用對(duì)屬性的操作
對(duì)隱藏屬性的操作可以在類里面開一個(gè)接口,再在里面可以加上條件限制
例:
class People:
def __init__(self,name,age):
self.__name=name
self.__age=age
def tell_info(self):
print('<name:%s age:%s>' %(self.__name,self.__age))
def set_info(self,name,age):
if type(name) is not str:
print('名字必須是str類型傻叉')
return
if type(age) is not int:
print('年齡必須是int類型傻叉')
return
self.__name=name
self.__age=age
obj=People('wzj',18)
obj.set_info('WZJ','18')
obj.tell_info()
property:了解知識(shí)點(diǎn)
了解一下?