物件導向 封裝

2022-08-24 05:45:14 字數 3635 閱讀 5292

將具體、複雜的細節封裝在一起。

如果想讓屬性或方法隱藏,在其前加 『__』 雙下劃線,python就將其視為私有。

注意:(1). 私有變數是在定義時生成的。

(2). python沒有實現絕對的私有,而是在定義時將私有屬性解析 『_類名__屬性』,(單下劃線類名雙下劃線屬性)

#

其實這僅僅這是一種變形操作

#類中所有雙下劃線開頭的名稱如__x都會自動變形成:_類名__x的形式:

class

a:

__x = 1 #

定義時被解釋為 _a__x

def__init__

(self, name):

self.

__name = name #

定義時被解釋為 self._a__name

def__foo(self): #

定義時被解釋為 _a__foo

print('

run foo')

defbar(self):

self.

__foo() #

只有在類內部才可以通過__foo的形式訪問到.

#外部無法通過『類名.屬性』的方式訪問

#print(a.__x) attributeerror: type object 'a' has no attribute '__x'

a = a('yk'

)print(a.__dict__) #

print(_a__name) #

yk 可以通過_類名__x的形式訪問

特點:

1.類中定義的__x只能在內部使用,如self.__x,引用的就是變形的結果。

2.這種變形其實正是針對外部的變形,在外部是無法通過__x這個名字訪問到的。

3.在子類定義的__x不會覆蓋在父類定義的__x,因為子類中變形成了:_子類名__x,而父類中變形成了:_父類名__x,即雙下滑線開頭的屬性在繼承給子類時,子類是無法覆蓋的。

問題:

1、這種機制也並沒有真正意義上限制我們從外部直接訪問屬性,知道了類名和屬性名就可以拼出名字:_類名__屬性,然後就可以訪問了,如a._a__n。

2、變形的過程只在類的定義是發生一次,在定義後的賦值操作,不會變形

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

#

正常情況

class

a:

deffa(self):

print('

from a')

deftest(self):

self.fa()

class

b(a):

deffa(self):

print('

from b')

b=b()

b.test()

#from b

#把fa定義成私有的,即__fa

class

a:

def__fa(self): #

在定義時就變形為_a__fa

print('

from a')

deftest(self):

self.

__fa() #

只會與自己所在的類為準,即呼叫self._a__fa

class

b(a):

def__fa

(self):

print('

from b')

b=b()

b.test()

#from a

#

1:封裝資料。將資料隱藏起來這不是目的。

#隱藏起來然後對外提供操作該資料的介面,然後我們可以在介面附加上對該資料操作的限制,

#以此完成對資料屬性操作的嚴格控制。

class

people:

def__init__

(self,name,age):

self.

__name =name

self.

__age =age

#訪問介面

deftell_info(self):

print('

姓名:%s,年齡:%s

' % (self.__name, self.__age

))

#修改介面

defset_info(self, name, age):

#新增自己的控制邏輯

ifnot

isinstance(name, str):

raise typeerror('

姓名必須是字串型別')

ifnot

isinstance(age, int):

raise typeerror('

年齡必須是整型')

self.

__name =name

self.

__age =age

p = people('

yk',18)

p.tell_info()

#yk,年齡:18

p.set_info('

小明',15)

p.tell_info()

#小明,年齡:15

p.set_info('

小花','

14') #

報錯 typeerror: 年齡必須是整型

#

2:封裝方法,隔離複雜度

#取款是功能,而這個功能有很多功能組成:插卡、密碼認證、輸入金額、列印賬單、取錢

#對使用者來說,只需要知道取款這個功能即可,其餘功能我們都可以隱藏起來,很明顯這麼做

#隔離了複雜度,同時也提公升了安全性.

class

atm:

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()

物件導向 封裝

面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候乙個乙個依次呼叫就可以了 物件導向是把構成問題事務分解成各個物件,建立物件的目的不是為了完成乙個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。面向過程 優點 效能比物件導向高,因為類呼叫時需要例項化,開銷比...

物件導向(封裝)

物件導向 封裝 封裝可以被認為是乙個保護屏障,防止該類的 和資料被外部類定義的 隨機訪問。如下 public class test public int getage public string getname public string getidnum public void setage in...

物件導向 封裝

car類 public class car 方法 public void salecar set 改屬性值。用了private之後,main方法只能呼叫,在car這個類裡才能修改private修飾的變數 傳入乙個double型別的引數 pr,main方法呼叫setprice方法,傳入pr的值,pr在...