1. 程式人生 > >Python3中的訪問限制詳解

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('張奶奶沒有這隻貓!')