Python的下劃線

近期研究Flask(Jinja2) 服務端模板注入漏洞,順便查了點資料解決python中的下劃線問題。

  • “_”單個下劃線

查了一些資料,Python中不存在真正的私有方法。爲了實現類似於c++中私有方法,可以在類的方法或屬性前加一個“_”單下劃線。_xxx如果是個變量,那麼這是一個protected變量,在原則上不允許直接訪問,如果是個定義_xxx()的方法,也表明這個方法原則上不能直接訪問。不過都說了是原則上的,外部類還是可以訪問到的。

class A(object):

    def __init__(self,n):
    self._n=n

    def _method_a(self):
    print "this is method a"

a=A(5)
print a._n
a._method_a()

這裏寫圖片描述

  • “__”雙下劃線
    __xxx或者__xxx()是個private類型的變量或方法,無法直接訪問。
class A(object):

    def __init__(self,n):
    self.__n=n

    def __method_a(self):
    print "this is method a"


a=A(5)
print a.__n#報錯
a.__method_a()#報錯

雙下劃線開頭的實例變量是不是一定不能從外部訪問呢?其實並不是。
在上述代碼片段中,__a實際上變成了_A__a,__method_a()變成了_A__method_a(),可以通過_A__a和_A__method_a()訪問。

class A(object):

    def __init__(self,n):
    self.__n=n

    def __method_a(self):
    print "this is method a"


a=A(5)
print a._A__n
a._A__method_a()

結果和上面一樣。

  • xxx__”前後雙下劃線**
    這個就很常見的,這是python的內置變量,是由python調用變量和方法,可以直接訪問。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章