zoukankan      html  css  js  c++  java
  • python 面向对象三 访问权限 下划线 双下划线

    一、双下划线

    如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。

    双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量。

    外部代码可以设置了__name变量,但实际上这个__name变量和class内部的__name变量不是一个变量!内部的__name变量已经被Python解释器自动改成了_Student__name,而外部代码给实例新增了一个__name变量。

     1 >>> class Student(object):
     2 ...     def __init__(self, name):
     3 ...         self.__name = name
     4 ...     def get_name(self):
     5 ...         return self.__name
     6 ...     def set_name(self, name):
     7 ...         self.__name = name
     8 ... 
     9 >>> st = Student('Jack')
    10 >>> st.get_name()
    11 'Jack'
    12 >>> st.set_name('Mike')
    13 >>> st.get_name()
    14 'Mike'
    15 >>> dir(st)
    16 ['_Student__name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'get_name', 'set_name']
    17 >>> st.__name
    18 Traceback (most recent call last):
    19   File "<stdin>", line 1, in <module>
    20 AttributeError: 'Student' object has no attribute '__name'
    21 >>> st._Student__name
    22 'Mike'
    23 >>> st.__name = 'New'   # 给实例新添加了一个变量
    24 >>> st.__name 
    25 'New'
    26 >>> st._Student__name
    27 'Mike'

    二、单下划线

    有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

    1 >>> class Student(object):
    2 ...     def __init__(self, name):
    3 ...         self._name = name
    4 ... 
    5 >>> st = Student('Jack')
    6 >>> st._name
    7 'Jack'

    三、特殊变量

    双下划线开头,并且以双下划线结尾的变量,特殊变量是可以直接访问的,不是private变量。

     1 >>> class Student(object):
     2 ...     def __init__(self, name):
     3 ...         self.__name = name
     4 ...     def get_name(self):
     5 ...         return self.__name
     6 ... 
     7 >>> st = Student('Jack')
     8 >>> st.get_name()
     9 'Jack'
    10 >>> st.__init__('Mike')
    11 >>> st.get_name()
    12 'Mike'
  • 相关阅读:
    RN-Android构建失败:Caused by: org.gradle.api.ProjectConfigurationException: A problem occurred configuring root project 'AwesomeProject'.
    Android更新包下载成功后不出现安装界面
    真机调试: The application could not be installed: INSTALL_FAILED_TEST_ONLY
    react native 屏幕尺寸转换
    Android Studio生成签名文件,自动签名,以及获取SHA1和MD5值
    React Native安卓真机调试
    git提交代码报错Permission denied, please try again
    The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
    命令行设置快捷命令
    Linux 常用指令
  • 原文地址:https://www.cnblogs.com/gundan/p/8051974.html
Copyright © 2011-2022 走看看