9 python 封裝

來源:互聯網
上載者:User

標籤:私人   type   card   電視   輸入   err   inpu   入口   照相   

1、基本概念

在python中用雙底線開頭的方式將屬性隱藏起來(設定成私人的)

#其實這僅僅這是一種變形操作#類中所有雙底線開頭的名稱如__x都會自動變形成:_類名__x的形式:class A:    __N=0 #類的資料屬性就應該是共用的,但是文法上是可以把類的資料屬性設定成私人的如__N,會變形為_A__N    def __init__(self):        self.__X=10 #變形為self._A__X    def __foo(self): #變形為_A__foo        print(‘from A‘)    def bar(self):        self.__foo() #只有在類內部才可以通過__foo的形式訪問到.#A._A__N是可以訪問到的,即這種操作並不是嚴格意義上的限制外部存取,僅僅只是一種文法意義上的變形

這種自動變形的特點:

  1. 類中定義的__x只能在內部使用,如self.__x,引用的就是變形的結果。
  2. 這種變形其實正是針對外部的變形,在外部是無法通過__x這個名字訪問到的。
  3. 在子類定義的__x不會覆蓋在父類定義的__x,因為子類中變形成了:_子類名__x,而父類中變形成了:_父類名__x,即雙下滑線開頭的屬性在繼承給子類時,子類是無法覆蓋的。

這種變形需要注意的問題是:

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

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

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

 

正常情況下:

#正常情況>>> class A:...     def fa(self):...         print(‘from A‘)...     def test(self):...         self.fa()... >>> class B(A):...     def fa(self):...         print(‘from B‘)... >>> b=B()>>> b.test()from B
#-----------------------------------------------

class A: def __fa(self): print(‘from A‘) def test(self): self.__fa()class B(A): def __fa(self): print(‘from B‘)b = B()b.test()
結果:from A

 

2、封裝不是單純意義的隱蔽2.1、封裝資料

將資料隱藏起來這不是目的。隱藏起來然後對外提供操作該資料的介面,然後我們可以在介面附加上對該資料操作的限制,以此完成對資料屬性操作的嚴格控制。

class Teacher:    def __init__(self,name,age):        self.__name=name        self.__age=age    def tell_info(self):        print(‘姓名:%s,年齡:%s‘ %(self.__name,self.__age))    def set_info(self,name,age):        if not isinstance(name,str):            raise TypeError(‘姓名必須是字串類型‘)        if not isinstance(age,int):            raise TypeError(‘年齡必須是整型‘)        self.__name=name        self.__age=aget=Teacher(‘egon‘,18)t.tell_info()t.set_info(‘egon‘,19)t.tell_info()
2.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(‘取款‘)    def withdraw(self):        self.__card()        self.__auth()        self.__input()        self.__print_bill()        self.__take_money()a = ATM()a.withdraw()輸出結果:插卡使用者認證輸入取款金額列印賬單取款

其他例子:

  1. 你的身體沒有一處不體現著封裝的概念:你的身體把膀胱尿道等等這些尿的功能隱藏了起來,然後為你提供一個尿的介面就可以了(介面就是你的。。。,),你總不能把膀胱掛在身體外面,上廁所的時候就跟別人炫耀:hi,man,你瞅我的膀胱,看看我是怎麼尿的。
  2. 電視機本身是一個黑盒子,隱藏了所有細節,但是一定會對外提供了一堆按鈕,這些按鈕也正是介面的概念,所以說,封裝並不是單純意義的隱藏!!!
  3. 快門就是傻瓜相機為傻瓜們提供的方法,該方法將內部複雜的照相功能都隱藏起來了

提示:在程式設計語言裡,對外提供的介面(介面可理解為了一個入口),可以是函數,稱為介面函數,這與介面的概念還不一樣,介面代表一組介面函數的集合體。

3.特性(property)

 

9 python 封裝

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.