python 類訪問控制

在python類中,有屬性和方法,外部代碼能夠直接經過實例來訪問修改.python

若是讓內部的屬性不被外部訪問到,在屬性變量前面加上__2個下劃線,在python中,實例的變量名若是是由__2個下花錢開頭的,就表明這是一個私有變量.只有內部能夠訪問,外部不準直接經過類或者實例訪問.
代碼:
1 class F:
2     __name = "xurui"
3 f = F()
4 f.__name
5 F.__name ##報錯,AttributeError: type object 'F' has no attribute '__name'
雖說外部訪問不了一個內部私有屬性,可是能夠經過類中方法間接的訪問到,修改
類內部方法getname和setname
 1 class F:
 2     __name = "xurui"             
 3     def getName(self):
 4         return self.__name,self
 5     def setName(self,name):
 6         self.__name = name
 7         return self.__name,self
 8 f = F()      #類中self,都是f這實例對象.
 9 res = f.getName()
10 print(res,f)
11 result = f.setName("zhangsan")
12 print(result,f)
13 結果:
14 ('xurui', <__main__.F object at 0x0000000000BAA048>) <__main__.F object at 0x0000000000BAA048>
15 ('zhangsan', <__main__.F object at 0x0000000000BAA048>) <__main__.F object at 0x0000000000BAA048>

雙下劃線開頭的私有屬性,是否是必定不能從外部訪問呢?其實不是的編程

1 class F:
2     __name = "xurui"
3 f = F()
4 result = f._F__name          ##經過這個方式能夠從外部訪問...
5 print(result) 
python中2個有趣的現象,外部變量遮蔽類中的變量..(來自核心編程)
從實例中訪問類屬性必需要謹慎.和一般python變量同樣,任何對實例屬性的賦值都會建立一個實例屬性(若是實例屬性不存在的話),而且對其賦值.可是,若是類屬性中存在同名的屬性,就是產生前面所說的有趣的反作用.python3.x依舊存在.
下面上代碼:
 1 class Foo:
 2     x = 10
 3 f = Foo()
 4 print("原始數據 經過實例訪問:{},經過類訪問:{}".format(f.x,Foo.x))
 5 # print(f.x += 10)
 6 f.x =f.x+10
 7 print("f.x增長10後 經過實例訪問:{},經過類訪問:{}".format(f.x,Foo.x))
 8 del f.x
 9 print("del幹掉f.x後 經過實例訪問:{},經過類訪問:{}".format(f.x,Foo.x))
10 ## 說明,代碼建立了一個f.x新的實例屬性,它覆蓋了對類屬性的引用.然而,類屬性自己沒有受到影響,仍然存在類域中,還能夠經過類屬性來訪問到.給一個與類屬性同名的實例屬性賦值,咱們會有效的遮蔽類屬性,一旦咱們刪除了這個實例屬性,類屬性又重現天日.
11 結果:
12 原始數據 經過實例訪問:10,經過類訪問:10
13 f.x增長10後 經過實例訪問:20,經過類訪問:10
14 del幹掉f.x後 經過實例訪問:10,經過類訪問:10
 1 class Foo:
 2     x = {"k1" : 10}
 3 f = Foo()
 4 print("原始數據 經過實例訪問:{},經過類訪問:{}".format(f.x,Foo.x))
 5 f.x["k1"] = 20
 6 print("f.x值變20後 經過實例訪問:{},經過類訪問:{}".format(f.x,Foo.x))
 7 del f.x
 8 print("del幹掉f.x後 經過實例訪問:{},經過類訪問:{}".format(f.x,Foo.x))
 9 結果:
10 Traceback (most recent call last):
11   File "C:/Users/xurui/PycharmProjects/q1/2017-02-21/lei/lei.py", line 10, in <module>
12     del f.x
13 AttributeError: x
14 原始數據 經過實例訪問:{'k1': 10},經過類訪問:{'k1': 10}
15 f.x值變20後 經過實例訪問:{'k1': 20},經過類訪問:{'k1': 20}
爲何下面的dict類型的就會del報錯呢??
緣由在於:
python是由c寫成的cpython.
c語言中,並無字符串這個概念,c中叫作字符數組,存儲在內存中,是一塊連續的空間,不可修改,任何修改字符數組的行爲,都會在不影響原始的字符數組下,建立產生一個新的字符數組..
而dict就不同了,它在內存中存儲,是一系列非連續的內存空間,能夠在原來的基礎上修改,因此,第二個例子中del f.x就會報錯.
相關文章
相關標籤/搜索