1. 程式人生 > >python學習之-類的封裝

python學習之-類的封裝

1. 什麼是封裝
裝:將屬性裝到一個容器裡,該容器可以是類也可以是物件

封:指的是將裝到容器裡的物件給隱藏起來,該隱藏是對外不對內的

2. 為何要封裝

隱藏資料屬性的目的

把資料屬性隱藏起來,是為了外使用者不能直接操作屬性,而是通過類內部開闢的介面來間接地操作屬性 我們可以在介面之上附加任意的控制邏輯,從而嚴格控制使用者對屬性的操作

隱藏函式屬性的目的:

 

3. 如何封裝
在屬性前加 __字首

 

封裝例項

class Foo:
__x=1 #這裡就是封裝
def __init__(self,name,age):
self.__name=name #這裡是封裝
self.__age=age #這裡是封裝

def tell_info(self): #這裡定義一個函式用來檢視類體內的封裝
print(self.__name,self.__age,self.__x,Foo.__x)

print(Foo.__x) #這時候已經訪問不到x這個值,外部訪問已經查詢不到
obj=Foo('egon',18)
print(obj.__name,obj.__age) #這裡物件也訪問不到,外部訪問已經查詢不到
print(obj.__dict__)
PS:原理就是類的靜態函式、類函式、普通函式、全域性變數以及一些內建的屬性都是放在類__dict__裡的,生成一個key:value的字典,然後在程式碼執行時候就會以key查詢

但凡__開頭的屬性,在類定義的時候,就會在字典里加上__開頭存入
obj.tell_info() #類內的函式可以訪問到
# print(Foo._Foo__x)#通過這樣的方式就可以訪問到,所以不是絕對隱藏
# print(obj._Foo__name)

注意:
1. __開頭屬性會在類定義階段檢測語法時發生變形,變形規則: _類名__屬性名
2. 類定義階段之後新增的__開頭的屬性不會變形
3. 在繼承中,父類如果不想讓子類覆蓋自己的方法,可以將方法定義為隱藏的

class Foo:
__x = 1 #這裡在定義的時候就發生了變形

def __init__(self, name, age):
self.__name = name #這裡在定義的時候就發生了變形

self.__age = age #這裡在定義的時候就發生了變形

def tell_info(self):
print(self.__name) #這裡在定義的時候就發生了變形

obj=Foo('egon',18)

obj.__yyy=111 #類定義之後新增不會發生變形
print(obj.__dict__) #檢視下有沒有變形
print(obj.__yyy) #這裡可以直接訪問到



class Foo:
def __f1(self): #在類定義階段變形成Foo__f1
print('Foo.f1')

def f2(self):
print('Foo.f2')#在類定義階段變形成Foo__f2

self.__f1() #這裡呼叫自己,不會和Bar裡面的f1衝突

class Bar(Foo):
def __f1(self): #在定義階段變形成Bar__f1
print('Bar.f1')

obj=Bar()
obj.f2()

PS:想訪問的方法就是訪問自己,把方法變成贏藏的,然後在一個地方呼叫,一定不會和別的同名的衝突,為什麼不會衝突,因為在類定義階段大家都統一進行了變形,變形規則就是自己的類名,所以和別人衝突不了,類名是不會重複的