封裝是物件導向三大特性最核心的乙個特性
封裝<->整合
1、如何隱藏:在屬性名前加__字首,就會實現乙個對外隱藏屬性效果
該隱藏需要注意的問題:
i:在類外部無法直接訪問雙下滑線開頭的屬性,但知道了類名和屬性名就可以拼出名字:_類名__屬性,然後就可以訪問了,如foo._a__n,
所以說這種操作並沒有嚴格意義上地限制外部訪問,僅僅只是一種語法意義上的變形。
class foo:
__x = 1 # _foo__x
def __f1(self): # _foo__f1
print('from test')
print(foo.__dict__)
print(foo._foo__x)
print(foo._foo__f1)
ii:這種隱藏對外不對內,因為__開頭的屬性會在檢查類體**語法時統一發生變形
class foo:
__x = 1 # _foo__x = 1
def __f1(self): # _foo__f1
print('from test')
def f2(self):
print(self.__x) # print(self._foo__x)
print(self.__f1) # print(self._foo__f1)
print(foo.__x)
print(foo.__f1)
obj=foo()
obj.f2()
iii: 這種變形操作只在檢查類體語法的時候發生一次,之後定義的__開頭的屬性都不會變形
class foo:
__x = 1 # _foo__x = 1
def __f1(self): # _foo__f1
print('from test')
def f2(self):
print(self.__x) # print(self._foo__x)
print(self.__f1) # print(self._foo__f1)
foo.__y=3
print(foo.__dict__)
print(foo.__y)
class foo:
__x = 1 # _foo__x = 1
def __init__(self,name,age):
self.__name=name
self.__age=age
obj=foo('egon',18)
print(obj.__dict__)
print(obj.name,obj.age)
2、為何要隱藏?
i、隱藏資料屬性"將資料隱藏起來就限制了類外部對資料的直接操作,然後類內應該提供相應的介面來允許類外部間接地運算元據,介面之上可以附加額外的邏輯來對資料的操作進行嚴格地控制:
設計者:egon
class people:
def __init__(self, name):
self.__name = name
def get_name(self):
通過該介面就可以間接地訪問到名字屬性
print('不讓看')
print(self.__name)
def set_name(self,val):
if type(val) is not str:
print('必須傳字串型別')
return
self.__name=val
使用者:lance
obj = people('egon')
print(obj.name) # 無法直接用名字屬性
obj.set_name('pipi')
obj.set_name(123123123)
obj.get_name()
ii、隱藏函式/方法屬性:目的的是為了隔離複雜度
python物件導向三大特性之封裝
封裝 類裡面不光有屬性還有方法。這種將屬性通過方法直接在類內部操作的形式就叫做封裝。把很多資料封裝到 個物件中,把固定功能的 封裝到 個 塊,函式,物件,打包成模組.這都屬於封裝的思想.封裝操作可以對受保護的成員進行功能開放的控制,達到保護資料不被非法訪問的目的。當然,方法也可以私有封裝,但是一般都...
Python物件導向三大特性之封裝
面向函式的程式設計和物件導向程式設計對比 通過函式和物件的方法實現同樣的功能,看起來是面向函式的程式設計比較簡單 假如是連線資料庫的增,刪,改,查操作使用物件導向的方法 更加簡單 vim day7 3.py usr bin python coding utf 8 def fetch 連線資料庫,ho...
python物件導向三大特性
定義 封裝一些資料和方法,只給外界提供必要的功能,掩蓋細節,提高 復用性和系統安全性。資料角度 用乙個類包裝多個變數,還可以定義方法,運算元據 行為角度 不同程式設計師開發乙個專案的不同功能,在使用時,直接呼叫,不需要思考其內部實現 設計角度 1 分而治之 拿到需求之後,分析需求,將需求拆解為不同的...