1、封裝的理解
封裝(Encapsulation):屬性和方法的抽象
屬性的抽象:對類的屬性(變量)進行定義、隔離和保護
分為私有屬性和公開屬性:
- 私有屬性:只能在類內部訪問
- 公開屬性:可以通過類、對象名訪問
可以選擇公開或隱藏屬性,隱藏屬性的內在機理
方法的抽象:對類的方法(函數)進行定義、隔離和保護
分為私有方法和公開方法:
- 私有方法:只能在類內部訪問
- 公開方法:可以通過類、對象名訪問
可以選擇公開或隱藏方法,隱藏方法的內部邏輯
- 目標是形成一個對外可操作屬性和方法的接口
封裝就是讓數據和代碼稱為類的過程,表達為:類——屬性——方法
2、私有類屬性、公開類屬性、私有實例屬性和公開實例屬性
2.1 公開類屬性
公開類屬性就是類屬性,語法結構
1
2
3
4
5
|
class ClassName: <類屬性名> = <類屬性初值> def __init__( self ,[參數 1 ], [參數 2 ], ...[參數n]): self .<實例屬性名> = <實例屬性初值> ... |
2.2 私有類屬性
私有類屬性只能當前類進行訪問,子類不能訪問。語法結構
1
2
3
4
5
|
class ClassName: <__私有類屬性名> = <私有類屬性初值> def __init__( self ,[參數 1 ], [參數 2 ], ...[參數n]): self .<實例屬性名> = <實例屬性初值> ... |
.<類屬性>
或者<對象名>.<類屬性>
的方式訪問
有效保證了屬性維護的可控性
示例代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class TestClass: __number = 0 def __init__( self , num_value): for i in range (num_value + 1 ): TestClass.__number + = i @classmethod # 類方法 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' |
在類外賣訪問.__number
就會報出AttributeError
異常
2.3 公開實例屬性
公開實例屬性就等于示例屬性,語法結構
1
2
3
4
5
|
class <類名>: <類屬性名> = <類方法值> def __init__( self , <參數列表>): self .<實例屬性名> = <實例屬性值> ... |
2.4 私有實例屬性
私有實例屬性只能在當前類內部使用,子類也不能使用。語法結構
1
2
3
4
5
|
class <類名>: <類屬性名> = <類方法值> def __init__( self , <參數列表>): self .<__私有實例屬性名> = <實例屬性值> ... |
.<類屬性>
或者<對象名>.<類屬性>
的方式訪問
有效保證了屬性維護的可控性
示例代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
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 私有屬性不一定真的私有
私有屬性的雙下劃線只是一種轉換約定,轉換后,類內原有名字發生了變化,這是一種形式上的私有
示例代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
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 # 可以通過 對象名._類名__屬性 的方式來訪問 |
可以通過對象名._類名__屬性的方式來訪問。
3、私有方法和公開方法
定義方法是在類內部定義并使用的方法。語法結構
1
2
3
|
class <類名>: def <__私有方法名>( self , <參數列表>): ... |
私有方法定義的時候屬性名字前面需要兩個下劃線( __
).
各類方法都可以通過增加雙下換線的方式將方法變為私有方法
私有方法在形式上保護了Python
類內部使用的函數邏輯
私有屬性與公開是程序員邏輯,不是安全邏輯,重視約定
4、類的保留屬性
Python
解釋器預留的類屬性,以雙下換線開頭或者結尾。
- 保留屬性也叫特殊屬性
- 以雙下劃線開頭和結尾
-
作用是為理解
Python
類提供了統一的屬性接口 - 屬性值具有特殊的含義,類定義后直接使用
僅用<類名>
訪問的保留屬性
保留屬性 | 描述 |
---|---|
__name__ | 類的名詞 |
__qualname__ | 以.分隔從模板全局命名空間開始的類名稱 |
__bases__ | 類所繼承的基類名稱 |
5、類的保留方法
保留方法是Python
解釋器預留的方法,以雙下劃線開頭和結尾
- 保留方法也叫特殊方法
- 以雙下劃線開頭和結尾
-
作用是為理解
Python
類提供了統一的方法接口 - 方法邏輯:具有特定的含義,一般與操作符關聯,類定義需要重載
到此這篇關于Python面向對象編程之類的封裝的文章就介紹到這了,更多相關Python類的封裝內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://juejin.cn/post/7023378125027278856