Python對於類的成員沒有嚴格的訪問控制限制,這與其餘面嚮對象語言有區別。關於私有 屬性和私有方法,有以下要點:安全
1. 一般咱們約定,兩個下劃線開頭的屬性是私有的(private)。其餘爲公共的(public)。ssh
2. 類內部能夠訪問私有屬性(方法)測試
3. 類外部不能直接訪問私有屬性(方法)編碼
4. 類外部能夠經過「_類名__私有屬性(方法)名」訪問私有屬性(方法)spa
【注】方法本質上也是屬性!只不過是能夠經過()執行而已。因此,此處講的私有屬性和公 有屬性,也同時是私有方法和公有方法的用法。code
【操做】私有屬性和公有屬性使用測試orm
#測試私有屬性、私有方法 class Employee: __company = 'xxx公司' #私有類屬性,經過dir能夠查到_Employee__company def __init__(self,name,age): self.name = name self.__age = age #私有實例屬性 def __work(self): #私有實例方法,經過dir能夠查到_Employee__work print('好好工做,努力賺錢') def say_company(self): print('個人公司是:',Employee.__company) #類內部能夠直接訪問私有屬性,經過類名.屬性名 print(self.name,'年齡是:',self.__age) self.__work() p = Employee('jack',18) print(p.name) print(dir(p)) p.say_company() print(p._Employee__age) #經過這種方式能夠直接訪問到私有屬性 p._Employee__work() #經過這種方式能夠直接訪問到私有方法 #print(p.__age) #直接訪問私有屬性報錯 #p.__work() #直接訪問私有方法報錯
運行結果:對象
jack
['_Employee__age', '_Employee__company', '_Employee__work', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'say_company']
個人公司是: xxx公司
jack 年齡是: 18
好好工做,努力賺錢
18
好好工做,努力賺錢blog
【說明】從打印的 Person 對象全部屬性咱們能夠看出。私有屬性「__age」在實際存儲時是按照 「_Person__age」這個屬性來存儲的。這也就是爲何咱們不能直接使用「__age」而能夠 使用「_Person__age」的根本緣由。文檔
@property 能夠將一個方法的調用方式變成「屬性調用」。
【操做】
#簡單測試@property class Employee: @property def salary(self): return 20000 emp = Employee() print(emp.salary) #方法salary()轉爲了屬性調用 print(type(emp.salary)) #<class 'int'> #emp.salary() #報錯:TypeError: 'int' object is not callable #emp.salary = 2000 #@property修飾的屬性若是沒有加setter方法,則爲只讀屬性。報錯:AttributeError: can't set attribute
@property 主要用於幫助咱們處理屬性的讀操做、寫操做。對於某一個屬性,咱們能夠直 接經過: emp.salary = 30000
如上的操做讀操做、寫操做。可是,這種作法不安全。好比,我須要限制薪水必須爲1-100000 的數字。這時候,咱們就須要經過getter、setter方法來處理。
【操做】
#測試@property class Employee: def __init__(self,name,salary): self.name = name self.__salary = salary #私有屬性 @property #至關於salary屬性的getter方法 def salary(self): print('月薪爲:{},年薪爲:{}'.format(self.__salary,12*self.__salary)) return self.__salary @salary.setter #至關於salary屬性的setter方法 def salary(self,salary): if(0<salary<100000): self.__salary = salary else: print('薪水錄入錯誤,只能在0-100000之間') emp = Employee('jack',10000) print(emp.salary) emp.salary = 0
屬性和方法命名總結:
一、_xxx:保護成員,不能用「frommodule import * 」導入,只有類對象和子類對象能訪 問這些成員。
二、__xxx__:系統定義的特殊成員
三、__xxx: 類中的私有成員,只有類對象本身能訪問,子類對象也不能訪問。(但,在類外 部能夠經過「對象名._類名__xxx」這種特殊方式訪問。 Python 不存在嚴格意義的私有成員)
類編碼風格:
1. 類名首字母大寫,多個單詞之間採用駝峯原則。
2. 實例名、模塊名採用小寫,多個單詞之間採用下劃線隔開。
3. 每一個類,應緊跟「文檔字符串」,說明這個類的做用。
4. 能夠用空行組織代碼,但不能濫用。在類中,使用一個空行隔開方法;模塊中,使用兩 個空行隔開多個類。