Luckylau's Blog

你懂python吗(4)

Python 的类的下划线命名

_xxx

单下划线开头的变量,标明是一个受保护(protected)的变量,原则上不允许直接访问,但外部类还是可以访问到这个变量,这只是程序员之间的一个约定,用于警告说明这是一个私有变量,外部类不要去访问它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Person(object):
def __init__(self, name):
self._name = name
class Student(Person):
def __init__(self, age):
super(Student,self).__init__("luckylau")
self._age = age
if __name__ == '__main__':
stu = Student(20)
print stu._age
print stu._name # 约定不能出现这样的代码来访问name属性,但实际是可以访问的。
#output
20
luckylau

__xxx

双下划线开头的,表示的是私有类型(private)的变量。只能是允许这个类本身进行访问了, 连子类也不可以,用于命名一个类属性(类变量),调用时名字被改变,双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Person(object):
def __init__(self, name):
self.__name = name
class Student(Person):
def __init__(self, age):
super(Student,self).__init__("luckylau")
self._age = age
if __name__ == '__main__':
stu = Student(20)
print stu.__name #AttributeError: 'Student' object has no attribute '__name' 子类不能访问
print stu._Person__name #这样可以访问
person=Person("luckylau") #AttributeError: 'Person' object has no attribute '__name' 实例不能访问
print person.__name #AttributeError: 'Person' object has no attribute '__name' 实例不能访问
print person._Person__name #这样可以访问
print person.__dict__ #{'_Person__name': 'luckylau'}

__xxx__ 以双下划线开头,并且以双下划线结尾的,是内置变量,内置变量是可以直接访问的,不是 private 变量,所以,不要自己定义这类变量

1
2
3
4
5
6
__init__
__file__
__dirt__
.
.
.
Luckylau wechat
如果对您有价值,看官可以打赏的!