(一)Python入門-6面向對象編程:06私有屬性和私有方法(實現封裝)-@property裝飾器-get和set方法-總結

一:私有屬性和私有方法(實現封裝)

  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裝飾器-get和set方法

  @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. 能夠用空行組織代碼,但不能濫用。在類中,使用一個空行隔開方法;模塊中,使用兩 個空行隔開多個類。

相關文章
相關標籤/搜索