Python - 面向對象(三)公共變量,受保護變量,私有變量


前言

在Python的類里面,所有屬性和方法默認都是公共的;但Python也可以設置受保護、私有類型的變量or方法

 

受保護類型的變量、方法

一般稱為:protected變量

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class protected:
    _protected = "受保護變量"
    name = "test"

    def test(self):
        print("實例屬性:", self._protected)
        print("類屬性:", protected._protected)

    @classmethod
    def class_m(cls):
        print("類方法中類屬性:", cls._protected)

    def _test(self):
        print("受保護的方法")


class protectedson(protected):

    def __init__(self):
        self._protected = "子類的受保護實例變量"
        print("子類實例屬性:", self._protected)
        print("子類類屬性:", protectedson._protected)


if __name__ == "__main__":
    p1 = protectedson()
    p1.test()
    print("子類實例對象調用類屬性", p1._protected)
    protectedson.class_m()
    print("類對象調用類屬性", protectedson._protected)
    p1._test()

 

執行結果

子類實例屬性: 子類的受保護實例變量
子類類屬性: 受保護變量
實例屬性: 子類的受保護實例變量
類屬性: 受保護變量
子類實例對象調用類屬性 子類的受保護實例變量
類方法中類屬性: 受保護變量
類對象調用類屬性 受保護變量
受保護的方法

知識點

  • 在變量和方法前加一個下划線 _ 即可變成protected類型的變量or方法
  • 父類的protected變量,子類能繼承
  • 實例對象能直接調用protected變量( 實例對象._protect ),類對象也能直接調用protected變量( 類對象._protect )

總的來說,和公共變量沒有什么特別大的區別

 

私有類型的變量、方法

 

#!/usr/bin/env python
# -*- coding: utf-8 -*-

class privates:
    __private = "私有變量"

    def test(self):
        print("實例對象 - 類內部調用私有變量:", self.__private)
        print("類對象 - 類內部調用私有變量:", privates.__private)

    @classmethod
    def class_m(cls):
        print("類方法 - 類對象 - 類內部調用私有變量:", cls.__private)

    def __test(self):
        print("私有方法")


if __name__ == "__main__":
    p1 = privates()
    p1.test()
    print("實例對象 - 外部調用私有變量", p1._privates__private)
    privates.class_m()
    print("類對象 - 外部調用私有變量", privates._privates__private)
    p1._privates__test()

執行方法

實例對象 - 類內部調用私有變量: 私有變量
類對象 - 類內部調用私有變量: 私有變量
實例對象 - 外部調用私有變量 私有變量
類方法 - 類對象 - 類內部調用私有變量: 私有變量
類對象 - 外部調用私有變量 私有變量
私有方法

知識點

  • 在變量和方法前加兩個下划線  __ 即可變成private類型的變量or方法
  • 子類無法訪問父類的私有變量、方法
  • 私有變量只有本類的內部能直接調用
  • But!外部真的不能訪問嗎?其實是可以訪問的,python解釋器對外會把 __私有變量 變成 _類名__私有變量 ,無論是實例對象還是類對象,都能通過 ._類名__私有變量 來調用私有變量,算是一種間接調用

 

總結

無論是受保護型變量還是私有變量,其實在外部還是能訪問的,所以並不能真正控制屬性的訪問權限;

 

帶着疑問

那我們如何才能控制屬性的訪問權限呢?Python給出的答案是裝飾器 @property,這將在后面的篇幅中介紹


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM