zoukankan      html  css  js  c++  java
  • python中的下划线

    在学习Python的时候,会不理解为什么在方法(method)前面会加好几个下划线,有时甚至两边都会加。在Python中下划线还具有 privateprotected 类似的访问权限作用,下面我们具体分析。
    Python主要存在四种命名:
    (1object      #公用方法
    (2)__object__  #内建方法,用户不要这样定义 
    (3)__object    #全私有,全保护(private)
    (4)_object     #半保护(protected
    核心风格:避免用下划线作为变量名的开始。
    
         因为下划线对解释器有特殊的意义,而且是内建所使用的符号,我们建议避免用下划线作为变量名的开始。一般来讲,变量名_object被看作是“私有 的”,在模块或类外不可以使用,不能用'from moduleimport *'导入。当变量是私有的时候,用_object来表示变量是很好的习惯。因为变量名__object__对Python 来说有特殊含义,对于普通的变量应当避免这种命名风格。
    
         python有关private的描述,python中不存在protected的概念,要么是public要么就是private,但是python中的private不像C++, Java那样,它并不是真正意义上的private,通过name mangling(名称改编(目的就是以防子类意外重写基类的方法或者属性),即前面加上“单下划线”+类名,eg:_Class__object)机制就可以访问private了。
    
         "单下划线" 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;"双下划线" 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据。(如下列所示)
         以单下划线开头(_foo)的代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;以双下划线开头的(__foo)代表类的私有成员;以双下划线开头和结尾的(__foo__)代表里特殊方法专用的标识,如 __init__()代表类的构造。
    

     

    1.class Foo():
    
    2.    def __init__():
    3.        ...
    4.    
    5.    def public_method():
    6.        print 'This is public method'
    7.
    8.    def __fullprivate_method():
    9.        print 'This is  underscore leading method'
    10.
    11.    def _halfprivate_method():
    12.        print 'This is one underscore leading method'
    实例化Foo的一个对象,
    
    1.    f = Foo()
    1.    f.public_method() # OK
    2.
    3.    f.__fullprivate_method() # Error occur
    4.
    5.    f._halfprivate_method() # OK
    6.
    7.    f._Foo__fullprivate()_method() # OK
    
        从上面的例子可以看出,f._halfprivate_method()可以直接访问,确实是。不过根据的约定,应该将其视作private,而不要在外部使用它们,(如果你非要使用也没辙),
    良好的习惯是不要在外部使用它。同时,根据Python docs的说明,_object和__object的作用域限制在本模块内
    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    LeetCode 79. 单词搜索
    LeetCode 1143. 最长公共子序列
    LeetCode 55. 跳跃游戏
    LeetCode 48. 旋转图像
    LeetCode 93. 复原 IP 地址
    LeetCode 456. 132模式
    LeetCode 341. 扁平化嵌套列表迭代器
    LeetCode 73. 矩阵置零
    LeetCode 47. 全排列 II
    LeetCode 46. 全排列
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/10356808.html
Copyright © 2011-2022 走看看