1. 程式人生 > >python:類的訪問許可權

python:類的訪問許可權

公有變數和方法

在Python中預設上物件的屬性和方法都是公開的,可以通過點操作符( . )來進行訪問

例1:

class Student:
    def __init__(self,name,score):
        self.name = name
        self.score = score
    def get_information(self):
        print("學生:%s,分數為:%s" % (self.name ,self.score)) #類中訪問例項變數通過 self.屬性名

person = Student("小明","95")

print("修改前的屬性名:",person.score)    #類外訪問例項變數通過 例項名.屬性名
person.get_information()

person.score = 0                        #通過例項名.屬性名修改例項變數的值
print("修改後的屬性名:",person.score)
person.get_information()

#上面程式碼的輸出結果為:
#修改前的屬性名: 95
#學生:小明,分數為:95
#修改後的屬性名: 0
#學生:小明,分數為:0

由上面的程式碼和輸出結果可以看出,在類中定義的非構造方法可以呼叫類中構造方法中的例項變數的屬性,呼叫方式為self.例項變數屬性名,如程式碼中的self.name和self.score。且可以在類的外部修改類的內部屬性


 私有變數

要讓內部屬性不被外部訪問可以在屬性名稱前加兩個下劃線( __ )。在python中,例項變數名前如果以__開頭,就會變成私有變數,只有內部可以訪問,外部不能訪問
例2:
class Student:
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
    def get_information(self):
        print("學生:%s,分數為:%s" % (self.__name ,self.__score))

person = Student("小明","95")

print("修改前的屬性名:",person.__score)   #在類的外部訪問私有屬性

#上面程式碼的輸出結果為:AttributeError: 'Student' object has no attribute '__score'
1、將變數定義為私有變數,可以確保外部程式碼不能隨意修改物件內部的狀態,通過訪問限制的保護,程式碼更加安全
2、若在類外部直接修改私有變數的值,是不會影響到最終例項(私有)變數的值

例3:
class Student:
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
    def get_information(self):
        print("學生:%s,分數為:%s" % (self.__name ,self.__score))


person = Student("小明","95")

person.get_information()

person.__score = 0                         #修改私有變數的值
print("修改後的屬性名:",person.__score)     #此處訪問的__score是上一行修改的__score值,相當於一個類變數
person.get_information()                   #修改後並不會影響到私有變數的值(偽修改)

#上面程式碼的輸出結果為:
#學生:小明,分數為:95
#修改後的屬性名: 0
#學生:小明,分數為:95

在類的外部獲取私有變數

在python中,可以通過為類增加的get_attrs方法來獲取類中的私有變數(定義一個get_屬性名的方法)
例4:
class Student:
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
    def get_information(self):
        print("學生:%s,分數為:%s" % (self.__name ,self.__score))
    def get_score(self):                    #定義get_attrs方法
        return self.__score

person = Student("小明","95")

print("修改前的屬性名:",person.get_score())  #通過get_例項變數名的方法來獲取私有變數的值
person.get_information()

person.__score = 0
print("修改後的屬性名:",person.__score)      #此處訪問的__score是上一行修改的__score值,相當於一個類變數
person.get_information()

#上面程式碼的輸出結果為:
#修改前的屬性名: 95
#學生:小明,分數為:95
#修改後的屬性名: 0
#學生:小明,分數為:95
在類的外部可以使用"例項名._類名__變數名"的方法獲取私有變數
例5:
class Student:
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
    def get_information(self):
        print("學生:%s,分數為:%s" % (self.__name ,self.__score))


person = Student("小明","95")
print("修改前的屬性名:",person._Student__score)     #通過例項名._類名__私有變數名來訪問私有變數
person.get_information()

person.__score = 0                                 #修改私有變數的值
print("修改後的屬性名:",person.__score)
person.get_information()

#上面程式碼的輸出結果為:
#修改前的屬性名: 95
#學生:小明,分數為:95
#修改後的屬性名: 0
#學生:小明,分數為:95

通過外部修改私有變數的值

在python中,可以通過set__attrs的方法來修改私有變數的值

例6:
class Student:
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
    def get_information(self):
        print("學生:%s,分數為:%s" % (self.__name ,self.__score))
    def get_score(self):
        return self.__score
    def set_score(self,new_score):           #通過set_變數名的方法修改例項變數的值
        self.__score = new_score

person = Student("小明","95")

print("修改前的屬性名:",person.get_score())   #通過get_例項變數名的方法來獲取私有變數的值(例項變數)
person.get_information()

person.set_score(0)                           #通過set_例項變數名的方法來修改私有變數的值(例項變數)
print("修改後的屬性名:",person.get_score())
person.get_information()

#上面程式碼的輸出結果為:
#修改前的屬性名: 95
#學生:小明,分數為:95
#修改後的屬性名: 0
#學生:小明,分數為:0
在python中,通過定義私有變數和對應的set方法可以幫助我們做引數檢查,避免傳入無效的引數

例7:

class Student:
    def __init__(self,name,score):
        self.__name = name
        self.__score = score
    def get_information(self):
        print("學生:%s,分數為:%s" % (self.__name ,self.__score))
    def get_score(self):
        return self.__score
    def set_score(self,new_score):        #通過set_變數名的方法修改例項變數的值
        if  0 <= new_score <= 100:
            self.__score = new_score
        else:
            print("輸入的份值錯誤,")

person = Student("小明","95")

print("修改前的屬性名:",person.get_score()) #通過get_例項變數名的方法來獲取私有變數的值(例項變數)
person.get_information()

person.set_score(-10)   #通過set_例項變數名的方法來修改私有變數的值(例項變數)
person.set_score(10)

print("修改後的屬性名:",person.get_score())
person.get_information()

#上面程式碼的輸出結果為:
#修改前的屬性名: 95
#學生:小明,分數為:95
#輸入的份值錯誤,
#修改後的屬性名: 10
#學生:小明,分數為:10

類的私有方法

類也有私有方法。類的私有方法也是以兩個下劃線開頭,宣告該方法為私有方法,不能再類外使用。私有方法的呼叫方法為self.方法名
例8:
class Student:
    def __init__(self):
        pass
    def __func(self):           #定義一個私有方法
        print("這是私有方法")
    def func(self):             #定義一個公有方法

        print("現在為公有方法,接下來呼叫私有方法")
        self.__func()

student = Student()
print("通過呼叫公有方法來間接呼叫私有方法")
student.func()
#student.__func()  #直接呼叫私有方法報錯:AttributeError: 'Student' object has no attribute '__func'