在python類中,有屬性和方法,外部代碼能夠直接經過實例來訪問修改.python
1 class F: 2 __name = "xurui" 3 f = F() 4 f.__name 5 F.__name ##報錯,AttributeError: type object 'F' has no attribute '__name'
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)
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}