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'
  • 相关阅读:
    NotePad++与MinGw的第一次HelloWorld——C语言环境配置说明
    Debian7.5.0安装流程(VirtualBox虚拟机环境)
    NotePad++插件——Customize Toolbar
    NotePad++与MinGw的第一次HelloWorld
    Debian7.5.0安装流程(VirtualBox虚拟机环境)
    stm32f103cbt6 sd卡 移植fatfs 显示在e-ink屏幕上
    stm32f429i disc usb cdc vcp 虚拟串口 example project (CubeMX Hal)
    stm32 cubemx 工程生成报错
    clover 在win10下工作不正常
    proxifier 3.29 key
  • 原文地址:https://www.cnblogs.com/gundan/p/8051974.html
Copyright © 2011-2022 走看看