Python – Property & _attribute

測試環境為 CentOS 8 x86_64 (虛擬機)

使用 Property 時可以把 類別(Class) 的 方法 (Method) 轉變成存取 屬性 (Attribute) 包含 setter , getter 與 deleter 等方法 (Method) , 參考文章 – https://www.maxlist.xyz/2019/12/25/python-property/

使用 Property 時屬性 (Attribute) 通常使用 _attribute 這種命名規則(不希望它被直接存取).

  • 範例: Property 的使用與 getter.
    [root@localhost ~]# vi computer1.py
    class computer:
        def __init__(self):
            self._CPU = 'Intel'
    
        @property
        def CPU(self):
            return self._CPU
    
    customer1 = computer()
    print(customer1.CPU)
    customer1.CPU = 'AMD'
    

    執行結果

    [root@localhost ~]# python3 computer1.py 
    Intel
    Traceback (most recent call last):
      File "computer1.py", line 11, in <module>
        customer1.CPU = 'AMD'
    AttributeError: can't set attribute
    

    說明:
    定義 computer 類別,並透過 Property 把 CPU 類別(Class) 的 方法 (Method) 轉變成存取 CPU 屬性 (Attribute) .

    class computer:
        def __init__(self):
            self._CPU = 'Intel'
    
        @property
        def CPU(self):
            return self._CPU
    

    建立 customer1 instance

    customer1 = computer()
    

    當讀取 Instance 的 CPU 屬性 customer1.CPU 時 是呼叫 CPU 方法(Method – def CPU(self) ),這方法為 CPU 屬性的 getter.

    print(customer1.CPU)
    

    執行結果

    Intel
    

    當我們要改變 Instance 的 CPU 屬性時卻生錯誤了,這是因為我們沒有定義 CPU 屬性相對應的 setter 才會出現錯誤.

    customer1.CPU = 'AMD'
    

    執行結果

    Traceback (most recent call last):
      File "computer1.py", line 11, in <module>
        customer1.CPU = 'AMD'
    AttributeError: can't set attribute
    
  • 範例: 增加 Property 的 setter 與 deleter
    [root@localhost ~]# vi computer2.py
    class computer:
        def __init__(self):
            self._CPU = 'Intel'
    
        @property
        def CPU(self):
            return self._CPU
    
        @CPU.setter
        def CPU(self, value):
            self._CPU = value
    
        @CPU.deleter
        def CPU(self):
            del self._CPU
            print('del complete')
    
    customer1 = computer()
    print(customer1.CPU)
    customer1.CPU = 'AMD'
    print(customer1.CPU)
    del customer1.CPU
    

    執行結果

    [root@localhost ~]# python3 computer2.py 
    Intel
    AMD
    del complete
    

    說明:

    • getter
      執行

      print(customer1.CPU)
      

      呼叫

          @property
          def CPU(self):
              return self._CPU
      

      結果

      Intel
      
    • setter
      執行

      customer1.CPU = 'AMD'
      print(customer1.CPU)
      

      呼叫

          @CPU.setter
          def CPU(self, value):
              self._CPU = value
      

      執行結果

      AMD
      
    • deleter
      執行

      del customer1.CPU
      

      呼叫

          @CPU.deleter
          def CPU(self):
              del self._CPU
              print('del complete')
      

      執行結果

      del complete
      
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料