1. 程式人生 > >python中類的定義、例項化、封裝以及私有變數/方法

python中類的定義、例項化、封裝以及私有變數/方法

1.  定義類

python中定義一個類的格式如下:

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. 類的例項

類的例項化方法如下:

obj=MyClass(x,x)

obj是類的例項化物件,MyClass是類名,括號內的變數是類的初始化變數(如果類中有定義的話)。

情況一: 類的初始屬性為空

class MyClass(object):
    def __init__(self):        
        print("MyClass類的構造方法被呼叫!")   
        
class1=MyClass()

情況二: 類含有初始屬性

class MyClass(object):
    def __init__(self,data1,data2):
        self.__data1=data1
        self.data2=data2    
        
class1=MyClass('first_data','sencond_data')
print(class1.data2)

3. 類的封裝

封裝、繼承和多型是類的三大特徵。類的封裝有兩層含義,一個是對資料的封裝,一個是對實現邏輯即方法的封裝。

資料(屬性)的封裝

還看上一個例子:

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就是對資料(屬性)的封裝。

實現邏輯(方法)的封裝

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定義私有屬性和私有方法的方法是在名稱前加上兩個下劃線 “__”。

私有屬性(變數)

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' 。

私有方法

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. 類外訪問類的私有屬性

類的私有屬性保證了外部程式碼不能隨意訪問/更改物件內部的資料和方法。

但是對類內私有屬性,在類外仍然可以通過以下兩種 方式進行訪問和修改,一是通過類內的公有函式修改,一是“非法修改”。

通過類內的公有函式修改

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 。所以如果你執意,仍然可以在類外部通過這個改變後的名稱“非法”訪問私有屬性。

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編譯器可能把私有屬性/方法包裝成不同的名字。