近期研究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调用变量和方法,可以直接访问。