Python3:私有成员
目錄
1.什么是私有成員
2.私有成員并非真正私有
3.私有函數調用方法
1.什么是私有成員
在Python里邊,一個類的成員(成員變量、成員方法)是否為私有,完全由這個成員的名字決定。如果一個元成員的名字以兩個下劃線__開頭,但不以兩個下劃線__結尾,則這個元素為私有的(private);否則,則為公有的(public)。Pyhton里邊并沒有protected的概念。
私有成員不以兩個下劃線結尾;所有的運算符重載相關方法,以一些特殊的成員方法如構造函數,都是以兩個下劃線開頭,兩個下劃線結尾,而且它們都是公有的。
私有成員,即只能在這個類里邊訪問;如果你在類外面訪問一個私有成員,系統會拋出一個異常,提示你這個成員不存在。請看如下代碼:
private_demo_1.py
# -*- coding: UTF-8 -*- """ # Python3: 私有成員 """class Demo:def __init__(self):self.__name = "xiaoming"def hello(self):# 在類內部使用私有成員變量__nameprint("my name is: %s." % self.__name)ins = Demo()# 正常輸出 ins.hello()# 拋異常,提示__name不存在 print("name: %s" % ins.__name)輸出:
my name is: xiaoming. Traceback (most recent call last):File "private_demo.py", line 21, in <module>print("name: %s" % ins.__name) AttributeError: 'Demo' object has no attribute '__name'可以看出來,可以在類的內部(成員方法中)使用私有變量__name。但當直接在外部訪問__name時,會收到一個異常,提示Demo類的對象沒有__name方法。顯然,這個異常的提示具有誤導性,因為__name實際上存在,知識不能直接訪問。
2.私有成員并非真正私有
其實,是可以在類的外面訪問私有成員,方法是,在私有成員的名字前面加上一個下劃線和類型,示例如下:
代碼如下:
private_demo_2.py
# -*- coding: UTF-8 -*- """ # Python3: 私有成員 """class Demo:def __init__(self):self.__name = "xiaoming"def hello(self):# 在類內部使用私有成員變量__nameprint("my name is: %s." % self.__name)ins = Demo() # 正常輸出 ins.hello()# 通過_Demo__name可以在外部訪問私有變量__name print("name: %s" % ins._Demo__name)輸出:
my name is: xiaoming. name: xiaoming可以看到,我們可以通過_Demo__name的方式在外部訪問私有變量__name。然而,在實際開發過程中,如果沒有特殊的需要,請不要這么做。我們將一個成員聲明為私有,具有一定的原因的,其中一個最主要的原因,就是不希望使用者直接訪問。雖然我們可以這樣做,但請務必遵守這個約定,避免出現不必要的問題。
3.私有函數調用方法
python中似有的概念:
- 私有函數不可以從它們的模塊外面被調用
- 私有類方法不能夠從它們的類外面被調用
- 私有屬性不能夠從它們的類外面被訪問
從上面的簡單示例可以看出:Python私有訪問的理念與其它編程語言基本一致,但實現卻有一丟丟特殊,一個 Python 函數,方法,或屬性是私有還是公有,完全取決于它的名字。
如果一個 Python 函數,類方法,或屬性的名字以兩個下劃線開始(但不是結束),它是私有的;其它所有的都是公有的。 Python 沒有類方法 保護 的概念(只能用于它們自已的類和子類中)。類方法或者是私有(只能在它們自已的類中使用)或者是公有(任何地方都可使用)。
在 Python 中,所有的專用方法和內置屬性遵守一個標準的命名習慣:開始和結束都有兩個下劃線。不要對你自已的方法和屬性用這種方法命名;到后面,它只會把你(或其它人)搞亂。 私有方法由于某種原因而私有,但是象其它很多在 Python 中的東西一樣,它們的私有化基本上是習慣問題,而不是強迫的。示例如下:
private_demo_3.py
# -*- coding: UTF-8 -*- """ # Python3: 私有成員 """class Demo:# 私有類方法def __privatefun(self):print('this is private function')ins = Demo() # 拋異常,'Demo' object has no attribute '__privatefun' # ins.__privatefun()# 通過_Demo____privatefun可以正常調用類方法 ins._Demo__privatefun()我們從類的外部調用了類的私有方法!這是一個很有意思的技巧,但是切記我們不應該這樣使用。
總結
以上是生活随笔為你收集整理的Python3:私有成员的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 赵总说说(待续)
- 下一篇: 教授专栏17 | 许佳龙:银行查找网安漏