Python 類與對象編程詳解二(成員保護和訪問限制)

上一篇:Python 類與對象編程詳解一(類與對象)

成員保護和訪問限制

私有屬性

Python 並沒有對私有成員提供嚴格的訪問保護機制,在定義類的屬性時,如果屬性名一個下劃線開頭的。此變量爲保護成員protected,只有類及其子類可以訪問。此變量不能通過from XXX import xxx 導入。
如果是以兩個下劃線開頭的,表示是私有變量,此變量爲私有private,只允許類本身訪問,連子類都不可以訪問。
否則是公有屬性,私有屬性在類的外部不能直接訪問,需要通過調用對象的公有成員方法來訪問,或者通過Python支持的特殊方式來訪問,Python提供了訪問私有屬性的特殊方式,可用於程序的測試和調試,對於成員方法也具有同樣的性質,這種方式如下:

對象名._類名+私有成員

例如訪問Car類中私有成員__weight:

car1._Car__weight

私有屬性是爲了數據封裝和保密而設計的屬性,一般只能在類的成員方法(類的內部)中使用訪問,雖然Python支持一種特殊的方式從外部直接訪問類的私有成員,但是並不推薦大家這麼做。公有屬性是可以公開使用的,既可以在類的內部進行訪問,也可以在外部程序中進行訪問

class Person(object): #定義一個person類
    legs = 2    #定義一個類變量

    def __init__(self,name,age):
        self.__age = age   #定義實例變量age
        self.name = name  #定義實例變量name
    def speak(self,str2):   #定義實例方法
        str1 = "python"   # 定義局部變量
        print(self.name + "對着" + str1 + "說" + str2)
        print(Person.legs)
Jack = Person("Jack",19)   #實例化對象
str2 = "hello"
print(Jack._Person__age)   #訪問私有屬性
# Jack.speak(str2)   #執行實例方法
# # print(Jack.legs)  #打印類屬性
# Person.speak(Jack,"hello")

私有方法

在類中定義的方法可以粗略的分爲3大類,即公有方法、私有方法、靜態方法。其中,公有方法、私有方法都屬於對象,私有方法的名字以兩個下劃線"__"開始,每個對象都有自己的公有方法和私有方法,在這兩類方法中可以訪問屬於類和對象的成員;公有方法通過對象名直接調用,私有方法不能通過對象名直接調用,只能在屬於對象的方法中通過self調用或在外部通過Python支持的特殊方法來調用。如果通過類名來調用屬於對象的公有方法,需要顯示地爲該方法的self參數傳遞一個對象名,用來明確指定訪問哪個對象的數據成員,靜態方法可以通過類名和對象名來調用,但不能直接訪問屬於對象的成員,只能訪問屬於類的成員。
實例:

class Fruit:
    price = 0
    def __init__(self):
        self.__color = "Red"   #定義和設置私有屬性color
        self.__city = "kunming"   #定義和設置私有屬性city
    def __outputColor(self):   #定義私有方法
        print(self.__color)    #打印私有屬性
    def __outputCity(self):
        print(self.__city)
    def output(self):      #定義公有方法
        self.__outputColor()   #調用私有方法
        self.__outputCity()
    @staticmethod        #定義靜態方法
    def getPrice():
        return Fruit.price    #返回類變量
    @staticmethod
    def setPrice(p):      # 定義靜態方法
        Fruit.price = p   #修改類變量
#主程序
apple = Fruit()    #實例化對象
apple.output()   #調用對象的公有方法
print(Fruit.getPrice())   #通過類名調用靜態方法
Fruit.setPrice(10)
print(Fruit.getPrice())

運行結果:

Red
kunming
0
10

下一篇:Python 類與對象編程詳解三(類屬性、實例屬性)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章