码迷,mamicode.com
首页 > 编程语言 > 详细

python 面向对象三 访问权限 下划线 双下划线

时间:2017-12-17 14:59:50      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:weakref   ike   most   back   obj   面向   post   span   size   

一、双下划线

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在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

 

python 面向对象三 访问权限 下划线 双下划线

标签:weakref   ike   most   back   obj   面向   post   span   size   

原文地址:http://www.cnblogs.com/gundan/p/8051974.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!