python中的下划线主要分为以下几类:java
将变量名,方法名指定为私有属性,但在外部仍旧能够访问到。这里只是一种约定俗成,对于私有方法或变量名,表明该对象/模块的这类方法或者变量不想暴露出来,应尽可能避免访问私有属性或方法。python
举例:code
class A(object): def __init__(self): self._private=0 def _private_method(self): print('AAAAA') >>>a=A() >>>a._private 0 >>>a._private_method()#均能直接访问 AAAAA
主要用于区分变量名对象
def_=3 int_=5
用双下划线修饰属性或者方法,会出发名称修饰,即在外部访问时,该方法名或变量名会变为 \_类名\_\_变量名;直接访问__变量名是不存在的。接口
举例:get
class A(object): def __init__(self): self.__private=0 def __private_method(self): print('AAAAA') >>>a=A() >>>a.__private Traceback (most recent call last): File "<input>", line 1, in <module> AttributeError: 'A' object has no attribute '__private' >>>a.__private_method()# Traceback (most recent call last): File "<input>", line 1, in <module> AttributeError: 'A' object has no attribute '__private_method' >>>a._A__private 0 >>>a._A__private_method() AAAAA
能够看到,这种状况下最好定义一个接口去直接访问。由于内部名称仍是没变的,名称修饰主要是在实例化后调用属性或者方法时做用了。input
class A(object): def __init__(self): self.__private=0 def __private_method(self): print('AAAAA') def get_p(self): return self.__private >>>a=A() >>>a.get_p() 0
包括上面的单下划线规约的私有属性,也能够经过定义接口方法去访问,这样的好处是私有的方法或者属性没法被篡改,能够很好的保护起来。这里能够和@property结合起来使用。it
举例:ast
>>>a=[_ for _ in range(10)] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>>a,_,_,d=func(*args,**kwargs) #这种状况是咱们只想要返回的第一个和第四个参数,中间两个对于当前模块没啥意义,就无需去定义一个变量名称。