近期研究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調用變量和方法,可以直接訪問。