成員保護和訪問限制
私有屬性
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