__x = 1 # _A__x
什麼是封裝
變量名稱前加上__ 就是隱藏變量。
隱藏類型的原理是 在定義的時候把隱藏名稱變名 __AttrName --------> _classname__AttrName
class Foo:
def __func(self):
print('from foo')
class Bar(Foo):
def __func(self):
print("from Bat")
b = Bar()
b._Bar__func()
... 特點: 1、外部無法直接obj.__AttrName 2、在類內部__AttrName是可以直接調用的 3、子類無法覆蓋父類__AttrName 的屬性(名字都不一樣啦,加了類名) ...
這種隱藏只是變性操作,把所有下劃線變成別的名稱。在類定義階段就實現。
例子一:
class A:
def foo(self):
print('A.foo')
def bar(self):
print('A.bar')
self.foo()
class B(A):
def foo(self):
print("B.foo")
b =B()
b.bar()
b沒有bar(),查到class A執行,但是調用foo的時候其實是調用的class B的函數。爲了在bar()絕對使用class A的foo函數, 因 此要用到封裝。
封裝的意義
1.封裝數據屬性:明確區分內外,控制外部對隱藏屬性的操作
在外部無法直接接觸到隱藏的屬性,可以在class內部寫一個接口提供窗口。但是這樣就規定了__name的格式。
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))
p = People('egon',18)
p.tell_info()
相同的道理,可以在class內部寫一個接口修改隱藏屬性的數據。並且可以對輸入的數據進行驗證功能。
def set_info(self,name,age):
if not isinstance(name,str):
return
self.__name = name
self.__age = age
2.封裝方法目的:隔離複雜度
將複雜的方法封裝在內部。
3.擴展性高
使用者無需改變自己的使用方式。