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调用变量和方法,可以直接访问。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章