封裝之如何隱藏物件及封裝的意義

2022-01-10 12:05:19 字數 4861 閱讀 9389

python中通常在屬性和方法前加__(兩條下劃線)來進行屬性和方法的隱藏。

特點:1.在類外無法直接obj.__attrname

2.在類內部可以直接使用obj.__attrname

3.子類無法覆蓋父類__開頭的屬性

1.在類外無法直接obj.__attrname

class

a:

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

class

a:

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.子類無法覆蓋父類__開頭的屬性

class

a:

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.外部不能直接飲用,需要物件._類__屬性的形式可以提出隱藏的屬性和方法

class

a:

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)

print

(a._a__name)

輸出結果:

gaohui

2.變形的過程只有在類的定義時發生一次,再次賦值時不會變形。

class

a:

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)

print

(a._a__name)

print(a.__b

)輸出結果:

gaohui

1

當類已經定義好了,再次定義時不會變形成隱藏的模式。

3.在繼承中,如果父類不想讓子類覆蓋自己的方法,可以將方法定義為私有的。

class

a:

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

封裝資料屬性的意義:明確的區分內外,控制外部對隱藏的屬性的操作行為

class

a:

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,而不是直接修改

封裝方法:

class

atm:

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 設定器 ...