Python面向?qū)ο缶幊讨?lèi)的封裝
1、封裝的理解
封裝(Encapsulation):屬性和方法的抽象
屬性的抽象:對(duì)類(lèi)的屬性(變量)進(jìn)行定義、隔離和保護(hù)
分為私有屬性和公開(kāi)屬性:
- 私有屬性:只能在類(lèi)內(nèi)部訪(fǎng)問(wèn)
- 公開(kāi)屬性:可以通過(guò)類(lèi)、對(duì)象名訪(fǎng)問(wèn)
可以選擇公開(kāi)或隱藏屬性,隱藏屬性的內(nèi)在機(jī)理
方法的抽象:對(duì)類(lèi)的方法(函數(shù))進(jìn)行定義、隔離和保護(hù)
分為私有方法和公開(kāi)方法:
- 私有方法:只能在類(lèi)內(nèi)部訪(fǎng)問(wèn)
- 公開(kāi)方法:可以通過(guò)類(lèi)、對(duì)象名訪(fǎng)問(wèn)
可以選擇公開(kāi)或隱藏方法,隱藏方法的內(nèi)部邏輯
- 目標(biāo)是形成一個(gè)對(duì)外可操作屬性和方法的接口
封裝就是讓數(shù)據(jù)和代碼稱(chēng)為類(lèi)的過(guò)程,表達(dá)為:類(lèi)——屬性——方法
2、私有類(lèi)屬性、公開(kāi)類(lèi)屬性、私有實(shí)例屬性和公開(kāi)實(shí)例屬性
2.1 公開(kāi)類(lèi)屬性
公開(kāi)類(lèi)屬性就是類(lèi)屬性,語(yǔ)法結(jié)構(gòu)
class ClassName:
<類(lèi)屬性名> = <類(lèi)屬性初值>
def __init__(self,[參數(shù)1], [參數(shù)2], ...[參數(shù)n]):
self.<實(shí)例屬性名> = <實(shí)例屬性初值>
...
2.2 私有類(lèi)屬性
私有類(lèi)屬性只能當(dāng)前類(lèi)進(jìn)行訪(fǎng)問(wèn),子類(lèi)不能訪(fǎng)問(wèn)。語(yǔ)法結(jié)構(gòu)
class ClassName:
<__私有類(lèi)屬性名> = <私有類(lèi)屬性初值>
def __init__(self,[參數(shù)1], [參數(shù)2], ...[參數(shù)n]):
self.<實(shí)例屬性名> = <實(shí)例屬性初值>
...
.<類(lèi)屬性>或者<對(duì)象名>.<類(lèi)屬性>的方式訪(fǎng)問(wèn)
有效保證了屬性維護(hù)的可控性
示例代碼如下:
class TestClass:
__number = 0
def __init__(self, num_value):
for i in range(num_value + 1):
TestClass.__number += i
@classmethod # 類(lèi)方法
def sum_number(cls):
return TestClass.__number
value1 = TestClass(100)
print(TestClass.sum_number()) # 5050
# print(value1.__number) # AttributeError: 'TestClass' object has no attribute '__number'
在類(lèi)外賣(mài)訪(fǎng)問(wèn).__number就會(huì)報(bào)出AttributeError異常
2.3 公開(kāi)實(shí)例屬性
公開(kāi)實(shí)例屬性就等于示例屬性,語(yǔ)法結(jié)構(gòu)
class <類(lèi)名>:
<類(lèi)屬性名> = <類(lèi)方法值>
def __init__(self, <參數(shù)列表>):
self.<實(shí)例屬性名> = <實(shí)例屬性值>
...
2.4 私有實(shí)例屬性
私有實(shí)例屬性只能在當(dāng)前類(lèi)內(nèi)部使用,子類(lèi)也不能使用。語(yǔ)法結(jié)構(gòu)
class <類(lèi)名>:
<類(lèi)屬性名> = <類(lèi)方法值>
def __init__(self, <參數(shù)列表>):
self.<__私有實(shí)例屬性名> = <實(shí)例屬性值>
...
.<類(lèi)屬性>或者<對(duì)象名>.<類(lèi)屬性>的方式訪(fǎng)問(wèn)
有效保證了屬性維護(hù)的可控性
示例代碼:
class TestClass:
def __init__(self, num_value):
self.__number = 0
for i in range(num_value + 1):
self.__number += i
def sum_number(self):
return self.__number
value1 = TestClass(100)
print(value1.sum_number()) # 5050
# print(value1.__number) # AttributeError: 'TestClass' object has no attribute '__number'
2.5 私有屬性不一定真的私有
私有屬性的雙下劃線(xiàn)只是一種轉(zhuǎn)換約定,轉(zhuǎn)換后,類(lèi)內(nèi)原有名字發(fā)生了變化,這是一種形式上的私有
示例代碼:
class TestClass:
def __init__(self, num_value):
self.__number = 0
for i in range(num_value + 1):
self.__number += i
def sum_number(self):
return self.__number
value1 = TestClass(100)
print(value1.sum_number()) # 5050
print(value1._TestClass__number) # 5050
# 可以通過(guò) 對(duì)象名._類(lèi)名__屬性 的方式來(lái)訪(fǎng)問(wèn)
可以通過(guò)對(duì)象名._類(lèi)名__屬性的方式來(lái)訪(fǎng)問(wèn)。
3、私有方法和公開(kāi)方法
定義方法是在類(lèi)內(nèi)部定義并使用的方法。語(yǔ)法結(jié)構(gòu)
class <類(lèi)名>:
def <__私有方法名>(self, <參數(shù)列表>):
...
私有方法定義的時(shí)候?qū)傩悦智懊嫘枰獌蓚€(gè)下劃線(xiàn)( __ ).
各類(lèi)方法都可以通過(guò)增加雙下?lián)Q線(xiàn)的方式將方法變?yōu)樗接蟹椒?/p>
私有方法在形式上保護(hù)了Python類(lèi)內(nèi)部使用的函數(shù)邏輯
私有屬性與公開(kāi)是程序員邏輯,不是安全邏輯,重視約定
4、類(lèi)的保留屬性
Python解釋器預(yù)留的類(lèi)屬性,以雙下?lián)Q線(xiàn)開(kāi)頭或者結(jié)尾。
- 保留屬性也叫特殊屬性
- 以雙下劃線(xiàn)開(kāi)頭和結(jié)尾
- 作用是為理解
Python類(lèi)提供了統(tǒng)一的屬性接口 - 屬性值具有特殊的含義,類(lèi)定義后直接使用
僅用<類(lèi)名>訪(fǎng)問(wèn)的保留屬性
| 保留屬性 | 描述 |
|---|---|
| __name__ | 類(lèi)的名詞 |
| __qualname__ | 以.分隔從模板全局命名空間開(kāi)始的類(lèi)名稱(chēng) |
| __bases__ | 類(lèi)所繼承的基類(lèi)名稱(chēng) |
5、類(lèi)的保留方法
保留方法是Python解釋器預(yù)留的方法,以雙下劃線(xiàn)開(kāi)頭和結(jié)尾
- 保留方法也叫特殊方法
- 以雙下劃線(xiàn)開(kāi)頭和結(jié)尾
- 作用是為理解
Python類(lèi)提供了統(tǒng)一的方法接口 - 方法邏輯:具有特定的含義,一般與操作符關(guān)聯(lián),類(lèi)定義需要重載
到此這篇關(guān)于Python面向?qū)ο缶幊讨?lèi)的封裝的文章就介紹到這了,更多相關(guān)Python類(lèi)的封裝內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python-ElasticSearch搜索查詢(xún)的講解
今天小編就為大家分享一篇關(guān)于Python-ElasticSearch搜索查詢(xún)的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02
python的pygal模塊繪制反正切函數(shù)圖像方法
在本篇文章中我們給大家整理了關(guān)于如何用python的pygal模塊繪制反正切函數(shù)圖像的知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2019-07-07
Python對(duì)象循環(huán)引用垃圾回收算法詳情
這篇文章主要介紹了Python對(duì)象循環(huán)引用垃圾回收算法詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容戒殺,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-09-09
Python實(shí)現(xiàn)提取XML內(nèi)容并保存到Excel中的方法
這篇文章主要介紹了Python實(shí)現(xiàn)提取XML內(nèi)容并保存到Excel中的方法,涉及Python針對(duì)xml文件的讀取、解析以及Excel文件的寫(xiě)入、保存等相關(guān)操作技巧,需要的朋友可以參考下2018-09-09
python hbase讀取數(shù)據(jù)發(fā)送kafka的方法
今天小編就為大家分享一篇python hbase讀取數(shù)據(jù)發(fā)送kafka的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python出現(xiàn)segfault錯(cuò)誤解決方法
這篇文章主要介紹了Python出現(xiàn)segfault錯(cuò)誤解決方法,分析了系統(tǒng)日志提示segfault錯(cuò)誤的原因與對(duì)應(yīng)的解決方法,需要的朋友可以參考下2016-04-04

