python 下划线意义

版权声明:本博主原创文章,欢迎转载。 https://blog.csdn.net/qq_24915933/article/details/87607956

本文将解释下列五中下划线在python中的使用意义

  • 单一下划线:_
  • 单前导下划线:_var
  • 单末尾下划线:var_
  • 双前导下划线:__var
  • 双前导和双末尾下划线:__var__

单一下划线:_

单一下划线是用作一个名字,来表示某个变量是临时的或无关紧要的,或缺省。

>>>for _ in range(0, 3):
    	print("python!") 
python!
python!
python!
>>>var, _, _ = 1, 0, 0
>>>var
1

单前导下划线:_var

python不像C++那样在“私有”和“公共”变量之间有很强的区别。 但是在python中,可以起到默认的小小的下划线警告标志,表示具有私有性质的成员属性,而不是真正会成为公共接口的一部分。

>>>class FOO(object):
    	def __init__(self):
	        self.f = 0
	        self._f = 10
>>>foo = FOO()
>>>foo._f
10

单末尾下划线:var_

单末尾下划线是由于像 class、def 这样的默认变量名称无法被使用,而采用添加单末尾下划线用以区分,来避免命名冲突。单个末尾下划线是一个约定,用来避免与Python关键字产生命名冲突。

>>>def foo(var, class_)
...

如果使用通配符从模块中导入所有名称,那么python不会导入带有前导下划线的名称(除非模块定义了覆盖此行为的__all__列表),大家可以尝试一下。

双前导下划线:__var

>>>class FOO(object):
    	def __init__(self):
	        self.f = 0
	        self._f = 10
	        self.__foo = 12
>>>foo = FOO()
>>>dir(foo)
['_FOO__foo', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', 
'__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', 
'__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__',
 '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', 
 '__sizeof__', '__str__', '__subclasshook__',
 '__weakref__', '_f', 'f']

我们能看到没有找到 ‘__foo’ 属性,但是多出了一个 '_FOO__foo’属性,这就是Python解释器所做的名称修饰, 这样做是为了防止变量在子类中被重写。而且该变量是无法直接获取的,是名称修饰,有点类似于私有成员,可以通过内部函数获取。

>>>class FOO(object):
		def __init__(self):
			self.f = 0
			self._f = 10
			self.__foo = 12
			self.__foo__ = 24
		def get_f(self):
			return self.__foo
>>>f=FOO()
>>>f.__foo
File "***.py", line 2963, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-16-5c407179b833>", line 1, in <module>
    f.__foo
AttributeError: 'FOO' object has no attribute '__foo'
>>>f.get_f()
12
>>>FOO()._FOO__foo
12

双前导和双末尾下划线:__var__

一个变量名称同时以双下划线开始和结束,则不会应用名称修饰。 由双下划线前缀和后缀包围的变量不会被python解释器修改。

>>>f.__foo__
24

python保留了有双前导和双末尾下划线的名称,用于特殊用途。例如,__init__对象构造函数,或__var__,使得一个对象可以被调用。最好避免在自己的程序中使用以双下划线开头和结尾的名称,以避免与将来python语言的变化产生冲突。

猜你喜欢

转载自blog.csdn.net/qq_24915933/article/details/87607956