python中通常在屬性和方法前加__(兩條下劃線)來進行屬性和方法的隱藏。
特點:1.在類外無法直接obj.__attrname
2.在類內部可以直接使用obj.__attrname
3.子類無法覆蓋父類__開頭的屬性
1.在類外無法直接obj.__attrname
classa:
def__init__
(self, name, life):
self.
__name =name
self.
__life =life
def__run
(self):
print('
run'
)
defsing(self):
self.
__run
()
print('
sing')
b = a('
gaohui
', 100)
print(b.__name
)報錯:
attributeerror: 'a
' object has no attribute '
__name
'
2.在類內部可以直接使用obj.__attrname
classa:
def__init__
(self, name, life):
self.
__name =name
self.
__life =life
def__run
(self):
print('
run'
)
defsing(self):
self.
__run
()
print('
sing')
b = a('
gaohui
', 100)
b.sing()
輸出結果:
runsing
此時的__run正常輸出了,因為在類的定義時,self.__run()已經便成了self._a__run()
3.子類無法覆蓋父類__開頭的屬性
classa:
def__init__
(self, name, life):
self.
__name =name
self.
__life =life
def__run
(self):
print('
run'
)
defsing(self):
self.
__run
()
print('
sing')
class
b(a):
def__init__
(self, name, age, life):
super().
__init__
(name, age)
self.
__life =life
def__run
(self):
print('
---'
)
print(a.__dict__
)print(b.__dict__
)輸出結果:{'
__module__
': '
__main__
', '
__init__
': __init__ at 0x1068190d0>, '
_a__run
': __run at 0x1068192f0>,{'
__module__
': '
__main__
', '
__init__
': __init__ at 0x106819730>, '
_b__run
': __run at 0x1068197b8>,
兩個run方法的屬性是不一樣的。
方法和屬性隱藏需要注意的地方:
1.外部不能直接飲用,需要物件._類__屬性的形式可以提出隱藏的屬性和方法
2.變形的過程只有在類的定義時發生一次,再次賦值時不會變形。
3.在繼承中,如果父類不想讓子類覆蓋自己的方法,可以將方法定義為私有的。
1.外部不能直接飲用,需要物件._類__屬性的形式可以提出隱藏的屬性和方法
classa:
def__init__
(self, name, life):
self.
__name =name
self.
__life =life
def__run
(self):
print('
run'
)
defsing(self):
self.
__run
()
print('
sing')
a = a('
gaohui
', 100)
(a._a__name)
輸出結果:
gaohui
2.變形的過程只有在類的定義時發生一次,再次賦值時不會變形。
classa:
def__init__
(self, name, life):
self.
__name =name
self.
__life =life
def__run
(self):
print('
run'
)
defsing(self):
self.
__run
()
print('
sing')
a.__b = 1a = a('
gaohui
', 100)
(a._a__name)
print(a.__b
)輸出結果:
gaohui
1
當類已經定義好了,再次定義時不會變形成隱藏的模式。
3.在繼承中,如果父類不想讓子類覆蓋自己的方法,可以將方法定義為私有的。
classa:
def__fa(self): *_a__fa
print('
from a')
deftest(self):
self.
__fa() #
此時的fa方法是變形過的_a__fa,所以之行類a中的fa方法
class
b(a):
def__fa(self): *_b__fa
print('
from b')
b =b()
b.test()
輸出結果:
from a
封裝資料屬性的意義:明確的區分內外,控制外部對隱藏的屬性的操作行為
classa:
def__init__
(self, name, age):
self.
__name =name
self.
__age =age
def tell_info(self): #
可以通過乙個介面來顯示被隱藏的資料,不能直接被外部呼叫
print('
name is %s, age is %s
' % (self.__name, self.__age
))
defsearch_info(self, name, age):
ifnot isinstance(name, str): #
檢驗是不是字串
print('
姓名為字串')
return
ifnot
isinstance(age, int):
print('
年齡已經為整數')
return
self.
__name =name
self.
__age =age
self.tell_info()
st = a('
gao', 23)
print(st.__dict__)#
st.search_info('gww', 23) # 可以通過乙個介面來修改name和age,而不是直接修改
封裝方法:
classatm:
def__card
(self):
print('插卡'
)
def__auth
(self):
print('
使用者驗證')
def__input
(self):
print('
輸入取款金額')
defwithdraw(self):
self.
__card
() self.
__auth
() self.
__input
()a =atm()
a.withdraw()
物件導向之封裝之如何隱藏屬性, 封裝的底層原理
1.什麼是封裝 封 屬性對外是隱藏的,但對內是開放的。裝 申請乙個命名空間,往裡裝入一系列名字 屬性。類和物件都是有乙個命名空間,往裡面裝一系列的名字 2 為什麼要封裝 封裝資料屬性的目的 首先定義屬性的目的就是為了給類外部的使用使用的,隱藏之後是為了不讓外部使用直接使用,需要類內部開闢乙個介面 然...
物件導向的封裝和隱藏
問題 當建立了類的物件以後,如果直接通過 物件.屬性 的方法對相應的物件屬性賦值的話,可能會出現不滿足實際的情況的意外,我們考慮不讓物件來直接作用屬性,而是通過 物件.方法 的形式來控制物件的屬性的訪問。實際情況中,物件的屬性要求就可以通過方法來體現。解決方法 封裝的思想 將類的屬性私有化,提供公共...
物件導向之封裝
定義 影藏事物的屬性和實現的細節,僅對外提供公共的訪問方式 封裝的好處 1.隱藏了事物的細節 2.提高了 的復用性 3.提高了安全性 封裝的實現 使用private關鍵字進行修飾,被private修飾的成員只能在本類中使用 setter和getter 封裝需要搭配set和get方法 set 設定器 ...