1. 程式人生 > >18.python類的保護和私有化

18.python類的保護和私有化

結論:

"_“和” _ _"的使用 更多的是一種規範/約定,並沒有真正達到限制的目的:

“_”:以單下劃線開頭的表示的是protected型別的變數,即只能允許其本身與子類物件直接進行訪問; “__”:雙下劃線的表示的是私有型別的變數。只能是允許這個類本身進行訪問了,連子類也不可以,這類屬性在執行時屬性名會加上單下劃線和類名。

當使用"from moduleNmae import *"時,不會將以一個下劃線開頭的物件和兩個下劃線開通的物件引入

# coding=utf-8
__author__ = 'Wang'

class Baseclass(object):
    a = "aa"
    _b = "bb"
    __c = "cc"

    def __init__(self, d, e, f):
        self.d = d
        self._e =e
        self.__f =f

    def _show1(self):#######1.所有的變數使用類的方法都可以訪問
        print self.a
        print self._b
        print self.__c
        print self.d
        print self._e
        print self.__f

    def __show2(self):
        print self.a
        print self._b
        print self.__c
        print self.d
        print self._e
        print self.__f

class Subclass(Baseclass):
    def __init__(self, d, e, f):
        super(Subclass, self).__init__(d, e, f)
        self.a="gg"

    def _get(self):#######2.子類的方法也可以直接訪問
        print self.a
        print self._b
        print self.__c
        print self.d
        print self._e
        print self.__f
if __name__ == "__main__":
    print "******1111***********"
    object = Baseclass("dd", "ee", "ff")
    print object.a
    print object._b
    print object.d    ##########例項可以訪問類屬性
    print object._e   ##########例項可以訪問類屬性
    # print object.__c  ###例項不能直接訪問帶__的類屬性
    # print object.__f  ###例項不能直接訪問帶__的變數
    print (object._Baseclass__c)#####例項+下劃線+類名+變數名訪問
    print (object._Baseclass__f)####例項+下劃線+類名+變數名訪問
    print "******2222***********"
    print Baseclass.a
    print Baseclass._b
    # print Baseclass.d    ##########類不能訪問例項屬性
    # print Baseclass._e   ##########類不能訪問例項屬性
    print (Baseclass._Baseclass__c)##類名+下劃線+類名+變數名訪問
    # print (Baseclass._Baseclass__f) #####類不能訪問例項屬性
    print "******3333***********"
    object._show1()
    print "######4444###########"
    object._Baseclass__show2()
    print "######5555###########"
    object2 = Subclass("dd", "ee", "ff")
    print object2.a
    print object2._b
    print object2.d    ##########例項可以訪問類屬性
    print object2._e   ##########例項可以訪問類屬性
    print (object2._Baseclass__c)###子類例項+下劃線+類名+變數名訪問
    print (object2._Baseclass__f)###子類例項+下劃線+類名+變數名訪問
    print "******6666***********"
    print Subclass.a
    print Subclass._b
    # print Baseclass.d    ##########類不能訪問例項屬性
    # print Baseclass._e   ##########類不能訪問例項屬性
    print "######77777###########"