欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python封裝原理與實(shí)現(xiàn)方法詳解

 更新時(shí)間:2018年08月28日 08:44:29   作者:—super—  
這篇文章主要介紹了Python封裝原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Python封裝的概念、原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Python封裝原理與實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:

【封裝】

 隱藏對(duì)象的屬性和實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外提供公共訪問(wèn)方式。

【好處】

1. 將變化隔離;

2. 便于使用;

3. 提高復(fù)用性;

4. 提高安全性;

【封裝原則】

1. 將不需要對(duì)外提供的內(nèi)容都隱藏起來(lái);

2. 把屬性都隱藏,提供公共方法對(duì)其訪問(wèn)。

私有變量和私有方法

在python中用雙下劃線開(kāi)頭的方式將屬性隱藏起來(lái)(設(shè)置成私有的)

私有變量

#其實(shí)這僅僅這是一種變形操作
#類中所有雙下劃線開(kāi)頭的名稱如__x都會(huì)自動(dòng)變形成:_類名__x的形式:
class A:
  __N=0 #類的數(shù)據(jù)屬性就應(yīng)該是共享的,但是語(yǔ)法上是可以把類的數(shù)據(jù)屬性設(shè)置成私有的如__N,會(huì)變形為_(kāi)A__N
  def __init__(self):
    self.__X=10 #變形為self._A__X
  def __foo(self): #變形為_(kāi)A__foo
    print('from A')
  def bar(self):
    self.__foo() #只有在類內(nèi)部才可以通過(guò)__foo的形式訪問(wèn)到.
#A._A__N是可以訪問(wèn)到的,即這種操作并不是嚴(yán)格意義上的限制外部訪問(wèn),僅僅只是一種語(yǔ)法意義上的變形

這種自動(dòng)變形的特點(diǎn):

1.類中定義的__x只能在內(nèi)部使用,如self.__x,引用的就是變形的結(jié)果。

2.這種變形其實(shí)正是針對(duì)外部的變形,在外部是無(wú)法通過(guò)__x這個(gè)名字訪問(wèn)到的。

3.在子類定義的__x不會(huì)覆蓋在父類定義的__x,因?yàn)樽宇愔凶冃纬闪耍篲子類名__x,而父類中變形成了:_父類名__x,即雙下滑線開(kāi)頭的屬性在繼承給子類時(shí),子類是無(wú)法覆蓋的。

這種變形需要注意的問(wèn)題是:

1.這種機(jī)制也并沒(méi)有真正意義上限制我們從外部直接訪問(wèn)屬性,知道了類名和屬性名就可以拼出名字:_類名__屬性,然后就可以訪問(wèn)了,如a._A__N

2.變形的過(guò)程只在類的定義是發(fā)生一次,在定義后的賦值操作,不會(huì)變形

私有方法

#正常情況
>>> 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

#把fa定義成私有的,即__fa
>>> class A:
...   def __fa(self): #在定義時(shí)就變形為_(kāi)A__fa
...     print('from A')
...   def test(self):
...     self.__fa() #只會(huì)與自己所在的類為準(zhǔn),即調(diào)用_A__fa
...
>>> class B(A):
...   def __fa(self):
...     print('from B')
...
>>> b=B()
>>> b.test()
from A

封裝與擴(kuò)展性

封裝在于明確區(qū)分內(nèi)外,使得類實(shí)現(xiàn)者可以修改封裝內(nèi)的東西而不影響外部調(diào)用者的代碼;而外部使用用者只知道一個(gè)接口(函數(shù)),只要接口(函數(shù))名、參數(shù)不變,使用者的代碼永遠(yuǎn)無(wú)需改變。這就提供一個(gè)良好的合作基礎(chǔ)——或者說(shuō),只要接口這個(gè)基礎(chǔ)約定不變,則代碼改變不足為慮。

#類的設(shè)計(jì)者
class Room:
  def __init__(self,name,owner,width,length,high):
    self.name=name
    self.owner=owner
    self.__width=width
    self.__length=length
    self.__high=high
  def tell_area(self): #對(duì)外提供的接口,隱藏了內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),此時(shí)我們想求的是面積
    return self.__width * self.__length

#使用者
>>> r1=Room('臥室','egon',20,20,20)
>>> r1.tell_area() #使用者調(diào)用接口tell_area
400

#類的設(shè)計(jì)者,輕松的擴(kuò)展了功能,而類的使用者完全不需要改變自己的代碼
class Room:
  def __init__(self,name,owner,width,length,high):
    self.name=name
    self.owner=owner
    self.__width=width
    self.__length=length
    self.__high=high
  def tell_area(self): #對(duì)外提供的接口,隱藏內(nèi)部實(shí)現(xiàn),此時(shí)我們想求的是體積,內(nèi)部邏輯變了,只需求修該下列一行就可以很簡(jiǎn)答的實(shí)現(xiàn),而且外部調(diào)用感知不到,仍然使用該方法,但是功能已經(jīng)變了
    return self.__width * self.__length * self.__high
#對(duì)于仍然在使用tell_area接口的人來(lái)說(shuō),根本無(wú)需改動(dòng)自己的代碼,就可以用上新功能
>>> r1.tell_area()
400

property屬性

property是一種特殊的屬性,訪問(wèn)它時(shí)會(huì)執(zhí)行一段功能(函數(shù))然后返回值

@property

@obj.setter

@obj.deleter

為什么要用property

將一個(gè)類的函數(shù)定義成特性以后,對(duì)象再去使用的時(shí)候obj.name,根本無(wú)法察覺(jué)自己的name是執(zhí)行了一個(gè)函數(shù)然后計(jì)算出來(lái)的,這種特性的使用方式遵循了統(tǒng)一訪問(wèn)的原則

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python面向?qū)ο蟪绦蛟O(shè)計(jì)入門(mén)與進(jìn)階教程》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python編碼操作技巧總結(jié)》及《Python入門(mén)與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Python 中判斷列表是否為空的方法

    Python 中判斷列表是否為空的方法

    這篇文章主要介紹了Python 中判斷列表是否為空的方法,本文通過(guò)代碼詳解的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Python的控制結(jié)構(gòu)之For、While、If循環(huán)問(wèn)題

    Python的控制結(jié)構(gòu)之For、While、If循環(huán)問(wèn)題

    這篇文章主要介紹了Python的控制結(jié)構(gòu)之For、While、If循環(huán)問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • 使用Django框架創(chuàng)建項(xiàng)目

    使用Django框架創(chuàng)建項(xiàng)目

    這篇文章介紹了使用Django框架創(chuàng)建項(xiàng)目的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Django url 路由匹配過(guò)程詳解

    Django url 路由匹配過(guò)程詳解

    這篇文章主要介紹了Django url 路由匹配過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • django 做 migrate 時(shí) 表已存在的處理方法

    django 做 migrate 時(shí) 表已存在的處理方法

    今天小編就為大家分享一篇django 做 migrate 時(shí) 表已存在的處理方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Python中else怎么用?else的用法總結(jié)

    Python中else怎么用?else的用法總結(jié)

    這篇文章主要介紹了Python中else的用法總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python如何設(shè)置utf-8為默認(rèn)編碼的問(wèn)題

    Python如何設(shè)置utf-8為默認(rèn)編碼的問(wèn)題

    這篇文章主要介紹了Python如何設(shè)置utf-8為默認(rèn)編碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Python使用matplotlib.pyplot畫(huà)熱圖和損失圖的代碼詳解

    Python使用matplotlib.pyplot畫(huà)熱圖和損失圖的代碼詳解

    眾所周知,在完成論文相關(guān)工作時(shí)畫(huà)圖必不可少,如損失函數(shù)圖、熱力圖等是非常常見(jiàn)的圖,在本文中,總結(jié)了這兩個(gè)圖的畫(huà)法,下面給出了完整的代碼,開(kāi)箱即用,感興趣的同學(xué)可以自己動(dòng)手嘗試一下
    2023-09-09
  • matplotlib源碼解析標(biāo)題實(shí)現(xiàn)(窗口標(biāo)題,標(biāo)題,子圖標(biāo)題不同之間的差異)

    matplotlib源碼解析標(biāo)題實(shí)現(xiàn)(窗口標(biāo)題,標(biāo)題,子圖標(biāo)題不同之間的差異)

    這篇文章主要介紹了matplotlib源碼解析標(biāo)題實(shí)現(xiàn)(窗口標(biāo)題,標(biāo)題,子圖標(biāo)題不同之間的差異),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 詳解詳解Python中writelines()方法的使用

    詳解詳解Python中writelines()方法的使用

    這篇文章主要介紹了詳解詳解Python中writelines()方法的使用,是Python入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-05-05

最新評(píng)論