本文實例講述了Python面向對象程序設計中類的定義、實例化、封裝及私有變量/方法。分享給大家供大家參考,具體如下:
1. 定義類
python中定義一個類的格式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class MyClass( object ): def __init__( self ,data1,data2): self .__data1 = data1 self .data2 = data2 def __func1( self ): print ( "MyClass類的私有方法被調用!" ) def print_data( self ): self .__func1() print ( self .__data1) print ( self .data2) def setData( self ,data): self .__data1 = data class1 = MyClass( 'first_data' , 'sencond_data' ) class1.print_data() class1._MyClass__func1() |
類通過關鍵字 class 引導,后跟類的名稱,通常第一個字母大寫,類名稱MyClass后的括號內的object表示該類的父類,如果定義的類沒有顯明從哪個類繼承來的,就在括號內使用object,object類是所有類的父類。
__init__
是定義的類的構造函數,可以對類的變量進行初始化,每當該類被實例化的時候,就會先執行該構造函數。
在類中定義的函數的一個參數一定要是self
,代表類當前的實例化對象,但在調用時,不需要傳遞這個參數。
2. 類的實例
類的實例化方法如下:
1
|
obj = MyClass(x,x) |
obj是類的實例化對象,MyClass是類名,括號內的變量是類的初始化變量(如果類中有定義的話)。
情況一: 類的初始屬性為空
1
2
3
4
|
class MyClass( object ): def __init__( self ): print ( "MyClass類的構造方法被調用!" ) class1 = MyClass() |
情況二: 類含有初始屬性
1
2
3
4
5
6
|
class MyClass( object ): def __init__( self ,data1,data2): self .__data1 = data1 self .data2 = data2 class1 = MyClass( 'first_data' , 'sencond_data' ) print (class1.data2) |
3. 類的封裝
封裝、繼承和多態是類的三大特征。類的封裝有兩層含義,一個是對數據的封裝,一個是對實現邏輯即方法的封裝。
數據(屬性)的封裝
還看上一個例子:
1
2
3
4
5
6
|
class MyClass( object ): def __init__( self ,data1,data2): self .__data1 = data1 self .data2 = data2 class1 = MyClass( 'first_data' , 'sencond_data' ) print (class1.data2) |
在這里類MyClass的實例化對象class1就具有了兩個屬性,分別是data1和data2,data1是私有屬性,只能在類內使用,data2是公有屬性,可以在類外使用。data1和data2就是對數據(屬性)的封裝。
實現邏輯(方法)的封裝
1
2
3
4
5
6
7
8
9
10
11
|
class MyClass( object ): def __init__( self ,data1,data2): self .__data1 = data1 self .data2 = data2 def printMax( self ): if self .__data1> self .data2: print ( self .__data1) else : print ( self .data2) class1 = MyClass( 66 , 88 ) class1.printMax() |
上邊類中的printMax函數實現了比較兩個數據大小并打印的功能,這個實現邏輯在類外部來說是看不到的,只可以調用該接口,相當于一個黑箱子,這就是實現邏輯(方法)的封裝。
4. 類的私有屬性
可以在類內定義類的私有屬性和方法,私有的表明只屬于類內部的,在類外部是不可以直接訪問的,python定義私有屬性和私有方法的方法是在名稱前加上兩個下劃線 “__”。
私有屬性(變量)
1
2
3
4
5
6
7
|
class MyClass( object ): def __init__( self ,data1,data2): self .__data1 = data1 self .data2 = data2 class1 = MyClass( 66 , 88 ) print (class1.data2) print (class1.__data1) |
上例中data2是公有變量,可以在類外訪問,所有calss1.data2沒有問題。 data1是類的私有屬性,類外不可以訪問,使用 class1.__data1會報錯 'MyClass' object has no attribute '__data1' 。
私有方法
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class MyClass( object ): def __init__( self ,data1,data2): self .__data1 = data1 self .data2 = data2 def __func1( self ): print ( "MyClass類的私有方法被調用!" ) def print_data( self ): self .__func1() print ( self .__data1) print ( self .data2) class1 = MyClass( 66 , 88 ) class1.print_data() #class1.__func1() |
上例中 print_data方法是類的公有方法,可以在類外直接調用, __func1方法是類的私有方法,不可以在類外調用,但是可以通過類內的print_data方法調用私有的__func1方法,即私有的方法可以在類的內部被調用。
5. 類外訪問類的私有屬性
類的私有屬性保證了外部代碼不能隨意訪問/更改對象內部的數據和方法。
但是對類內私有屬性,在類外仍然可以通過以下兩種 方式進行訪問和修改,一是通過類內的公有函數修改,一是“非法修改”。
通過類內的公有函數修改
1
2
3
4
5
6
7
8
9
10
11
|
class MyClass( object ): def __init__( self ,data1,data2): self .__data1 = data1 self .data2 = data2 def setData1( self ,data): self .__data1 = data def printData1( self ): print ( self .__data1) class1 = MyClass( 66 , 88 ) class1.setData1( 100 ) class1.printData1() |
非法修改
python中類的私有屬性或方法之所以不能直接從類外部進行訪問,是因為python解釋器把私有的屬性或方法 __xx 對外展示成了 _Class__xx,即單下劃線+類名+__xx 。所以如果你執意,仍然可以在類外部通過這個改變后的名稱“非法”訪問私有屬性。
1
2
3
4
5
6
7
8
|
class MyClass( object ): def __init__( self ,data1,data2): self .__data1 = data1 self .data2 = data2 def printData1( self ): print ( self .__data1) class1 = MyClass( 66 , 88 ) print (class1._MyClass__data1) |
當然一般不建議這么干,不同的python編譯器可能把私有屬性/方法包裝成不同的名字。
希望本文所述對大家Python程序設計有所幫助。
原文鏈接:https://blog.csdn.net/dcrmg/article/details/75041125