隱藏屬性
#申明類時,資料屬性或者函式屬性,在屬性名稱前加上兩個下劃線,就實現了屬性隱藏,但在python裡不存在絕對的隱藏,它只是在申明的時候定義了它的呼叫方式。
class
a:
__country = "
china
"def
__def
(self):
print(self.__country
)a =a()
print(a.__country) #
報錯,這是隱藏屬性
print(a._a__country) #
對的,python裡不會絕對隱藏,只是在類命名的時候定義了新的訪問方式,需要在隱藏變數名前加 "_類名" 就可以訪問
print(a.__dict__) #
可以看到在類a的屬性字典裡有乙個kv是'_a__country': 'china',隱藏的函式屬性也一樣的道理
#當然python只是沒有絕對隱藏,但是如果加上了隱藏屬性,一般不會像上面那樣去訪問,那這個有什麼用呢?
#1.防止屬性被改寫 2.防止類內部在呼叫屬性的時候呼叫到別的類的屬性
class
a:
deffunc1(self):
print("
i am func1 from a")
def__func2
(self):
print("
i am func2 from a")
deffunc3(self):
print("
i am func3 from a")
self.func1()
#b呼叫時,這裡實際是 b.func1(),那麼他先會在b類裡找func1,所以這裡會列印("i am func1 from b")
self.__func2() #
b呼叫時,這裡實際是 b._a__func1(),那麼找到的就是a類裡的__func2,所以這裡會列印("i am func2 from a")
class
b(a):
deffunc1(self):
print("
i am func1 from b")
def__func2(self): #
這裡並不是改寫父類a的__func2,因為這裡已經變成了,_b__func2
print("
i am func2 from a")
b =b()
b.func3()
封裝資料屬性:明確的區分內外,控制外部對隱藏的屬性的操作行為
classpeople:
def__init__
(self,name,age):
self.
__name=name
self.
__age=age
deftell_info(self):
print('
name:<%s> age:<%s>
' %(self.__name,self.__age
))
defset_info(self,name,age):
ifnot
isinstance(name,str):
print('
名字必須是字串型別')
return
ifnot
isinstance(age,int):
print('
年齡必須是數字型別')
return
self.
__name=name
self.
__age=age
p=people('
egon
',18)
#p.tell_info()
#p.set_info('egon',38)
#p.tell_info()
#p.set_info(123,38)
p.set_info('
egon
','38')
p.tell_info()
封裝方法:隔離複雜度
classatm:
def__card
(self):
print('插卡'
)
def__auth
(self):
print('
使用者認證')
def__input
(self):
print('
輸入取款金額')
def__print_bill
(self):
print('
列印賬單')
def__take_money
(self):
print('取款'
)
defwithdraw(self):
self.
__card
() self.
__auth
() self.
__input
() self.
__print_bill
() self.
__take_money
()a =atm()
a.withdraw()
property 將函式屬性變成資料屬性,但只是像資料屬性,並不是真的資料屬性,在重新賦值的時候會報錯。
classpeople:
def__init__
(self,name,weight,height):
self.name=name
self.weight=weight
self.height=height
@property
defbmi(self):
return self.weight / (self.height ** 2)
p=people('
xg',60,168)
#print(p.bmi)
#p.bmi=3333 #報錯attributeerror: can't set attribute
#但是有一些方法可以修改和刪除這些屬性。
class
a:
def__init__
(self, name):
self.
__name =name
@property
defname(self):
return self.__name
@name.setter
def name(self, name): #
修改被property裝飾的函式屬性,直接 a.name = new_name 即可
self.__name =name
@name.deleter
def name(self): #
刪除 a.name ,直接 del a.name 即可
print("
不可以刪除")
a = a("xg"
(a.name)
a.name = "xg"
(a.name)
dela.name
print(a.name)
Python3 從零單排5 內建函式
python一些常用的內建函式及作用請見以下 lis 1,4,3,8,2,9,10,0 print all lis 判斷可迭代物件裡頭是否存在不為真的元素,如果存在不為真的元素則返回false,否則true print any lis 判斷可迭代物件裡頭是否存在為真的元素,如果存在為真的元素則返回t...
python第三次封裝 python 3 封裝
python 3 封裝 從封裝本身的意思去理解,封裝就好像是拿來乙個麻袋,把小魚,小蝦,小王八,一起裝進麻袋,然後把麻袋封上口子。照這種邏輯看,封裝 隱藏 這種理解是相當片面的。先看如何隱藏 在python中用雙下劃線開頭的方式將屬性隱藏起來 設定成私有的 其實這僅僅這是一種變形操作 類中所有雙下劃...
python3 從零單排3 函式 購買商品小程式
題目如下 商品檔案products.txt裡存的內容如下 使用者檔案user.txt裡存的內容如下 xg 管理員可以操作 1.給使用者充值,輸入使用者名稱,修改money,100000 2.新增商品 3.logout 普通使用者可以操作 1.看商品資訊 2.買東西,a.東西加products,mon...