知識點 - python 類的私有/保護 屬性和方法


類的私有屬性:

__private_attrs:兩個下划線開頭,聲明該屬性為私有,不能在類地外部被使用或直接訪問。
在類內部的方法中使用時  self.__private_attrs。

類的方法:

在類地內部,使用def關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數self,且為第一個參數

類的私有方法 :

__private_method:兩個下划線開頭,聲明該方法為私有方法,不能在類地外部調用。
在類的內部調用 self.__private_methods

 

 

默認情況下,Python中的成員函數和成員變量都是公開的(public),在python中沒有類似public,private等關鍵詞來修飾成員函數和成員變量。
在python中定義私有變量只需要在變量名或函數名前加上 ”__“兩個下划線,那么這個函數或變量就是私有的了。
在內部,python使用一種 name mangling 技術,將 __membername替換成 _classname__membername,也就是說,類的內部定義中,
所有以雙下划線開始的名字都被"翻譯"成前面加上單下划線和類名的形式。

     例如:為了保證不能在class之外訪問私有變量,Python會在類的內部自動的把我們定義的__spam私有變量的名字替換成為
_classname__spam(注意,classname前面是一個下划線,spam前是兩個下划線),因此,用戶在外部訪問__spam的時候就會
提示找不到相應的變量。   python中的私有變量和私有方法仍然是可以訪問的;訪問方法如下:

私有變量:實例._類名__變量名
私有方法:實例._類名__方法名()
class people():
    __place = "nanjing"
    _age1 = 20

    def __init__(self, name):
        self.name = name

    def __sayhello(self):
        print("%s say hello" % self.name)

class teacher(people):
    pass

t1 = teacher("cmz")
print(t1._people__place)  # 訪問私有變量
t1._people__sayhello()    # 訪問私有方法

結果是
nanjing
cmz say hello
python私有屬性和方法案例

 


其實,Python並沒有真正的私有化支持,但可用下划線得到偽私有。   盡量避免定義以下划線開頭的變量!

1)_xxx      "單下划線" 開始的成員變量叫做保護變量,意思是只有類實例和子類實例能訪問到這些變量,
               需通過類提供的接口進行訪問;不能用'from module import *'導入
(2)__xxx    類中的私有變量/方法名 (Python的函數也是對象,所以成員方法稱為成員變量也行得通。),
              " 雙下划線 " 開始的是私有成員,意思是只有類對象自己能訪問,連子類對象也不能訪問到這個數據。
(3)__xxx__ 系統定義名字,前后均有一個“雙下划線” 代表python里特殊方法專用的標識,如 __init__()代表類的構造函數。
class people():
    __place = "nanjing"
    _age = 20

    def __init__(self, name):
        self.name = name

    def _test(self):
        print("from people test")

    def __sayhello(self):
        print("%s say hello" % self.name)

class teacher(people):
    pass

t1 = teacher("cmz")
print(t1._age)
print(people._age)
t1._test()
people._test(t1) # 傳入對象t1

結果是
20
20
from people test
from people test
單下划線
class people():
    __place = "nanjing"
    _age = 20

    def __init__(self, name):
        self.name = name

    def __sayhello(self):
        print("%s say hello" % self.name)

class teacher(people):
    pass

t1 = teacher("cmz")
print(t1._people__place)
t1._people__sayhello()

結果是
nanjing
cmz say hello
雙下划線

 


免責聲明!

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



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