Python3中的訪問限制詳解
訪問限制
私有:只能自己使用,別人不能使用
好處:1.外部不能隨意更改 提高了安全性
2.可以起到資料過濾的作用
格式:在建構函式變數的前邊加上兩個下劃線__
看個案例:
建立一個Person類,有name和age兩個屬性,其中age為私有屬性,不可從外部更改。
class Person:
def __init__(self):
self.name=None
self.__age=None # age前邊加兩個下劃線是訪問限制的標誌
#這時候在進行建立物件並呼叫類屬性的時候,物件是無法獲得age的賦值許可權的。
上邊我們進行了對age的訪問限制,但是真的就沒有其他的方法去修改age的值了嗎?答案是當然有!
1.建立在內部建立set和get函式
class Person: def __init__(self): self.name=None self.__age=None def setAge(self,a): if a<0: print("不合法") else: self.__age=a def getAge(self): return self.__age p1=Person() p1.setAge(-10) print(p1.getAge())
通過這種方法,我們就達到了修改限制屬性的值,訪問限制還有一個比較有用的功能就是資料過濾的功能,這個就比較有用了,比如我上邊的程式碼,如果我輸入的年齡為負值,那麼就提示我輸入不合法,這樣也就沒有給age賦上值,只有輸入正確的格式時才能進行賦值,所以這一功能也就避免了記錄一些沒有用的數值。
2.使用@property裝飾器代替set,get方法進行外部訪問限制
@property 是一個裝飾器,當我們設定set,get時,程式碼會比較繁瑣,這個裝飾器就是解決這個問題的
@property 和set,get的使用區別是,當只為get行為新增裝飾器@property時,
例項物件只能讀取建構函式屬性,但是不能進行修改,
如果想要修改必須為set行為新增@xx.setter裝飾器(有@property時自動生成)。
看例子:
class Cat:
def __init__(self,name):
self.__name = name
@property
def name(self):
return self.__name
#注意觀察@name.setter寫與不寫,例項物件屬性的變化
@name.setter
def name(self,value):
self.__name = value
c = Cat('小白')
c.name = '小花'#看變化
print(c.name)
通過這種方法,我們就達到了節省程式碼量的目的,也實現了訪問限制。
下面看一個訪問限制的作業題:
# 練習題:
# 有兩隻貓:
# 一隻叫小花,今年3歲,花色。
# 另一隻叫小白,今年3歲,白色。
# 請編寫一個程式,當用戶輸入小貓的名字時,就顯示該貓的名字、年齡、顏色。
# 如果輸入的小貓名錯誤,則顯示 張老太沒有這隻貓。
# 要求:
# 貓的屬性全為私有屬性
# 通過set修改屬性,通過get獲取屬性
class Cat:
def __init__(self):
self.__name = None
self.__age = None
self.__color = None
def set(self,name,age,color):
self.__name = name
self.__age = age
self.__color = color
def get(self):
return self.__name,self.__age,self.__color
c1,c2= Cat(),Cat()
c1.set('小花','3歲','花色')
c2.set('小白','3歲','白色')
cn = input('請輸入貓名:')
if cn == '小花':
print(c1.get())
elif cn == '小白':
print(c2.get())
else:
print('張奶奶沒有這隻貓!')