结论:
"_“和” _ _"的使用 更多的是一种规范/约定,并没有真正达到限制的目的:
“_”:以单下划线开头的表示的是protected类型的变量,即只能允许其本身与子类对象直接进行访问;
“__”:双下划线的表示的是私有类型的变量。只能是允许这个类本身进行访问了,连子类也不可以,这类属性在运行时属性名会加上单下划线和类名。
当使用"from moduleNmae import *"时,不会将以一个下划线开头的对象和两个下划线开通的对象引入
# coding=utf-8
__author__ = 'Wang'
class Baseclass(object):
a = "aa"
_b = "bb"
__c = "cc"
def __init__(self, d, e, f):
self.d = d
self._e =e
self.__f =f
def _show1(self):#######1.所有的变量使用类的方法都可以访问
print self.a
print self._b
print self.__c
print self.d
print self._e
print self.__f
def __show2(self):
print self.a
print self._b
print self.__c
print self.d
print self._e
print self.__f
class Subclass(Baseclass):
def __init__(self, d, e, f):
super(Subclass, self).__init__(d, e, f)
self.a="gg"
def _get(self):#######2.子类的方法也可以直接访问
print self.a
print self._b
print self.__c
print self.d
print self._e
print self.__f
if __name__ == "__main__":
print "******1111***********"
object = Baseclass("dd", "ee", "ff")
print object.a
print object._b
print object.d ##########实例可以访问类属性
print object._e ##########实例可以访问类属性
# print object.__c ###实例不能直接访问带__的类属性
# print object.__f ###实例不能直接访问带__的变量
print (object._Baseclass__c)#####实例+下划线+类名+变量名访问
print (object._Baseclass__f)####实例+下划线+类名+变量名访问
print "******2222***********"
print Baseclass.a
print Baseclass._b
# print Baseclass.d ##########类不能访问实例属性
# print Baseclass._e ##########类不能访问实例属性
print (Baseclass._Baseclass__c)##类名+下划线+类名+变量名访问
# print (Baseclass._Baseclass__f) #####类不能访问实例属性
print "******3333***********"
object._show1()
print "######4444###########"
object._Baseclass__show2()
print "######5555###########"
object2 = Subclass("dd", "ee", "ff")
print object2.a
print object2._b
print object2.d ##########实例可以访问类属性
print object2._e ##########实例可以访问类属性
print (object2._Baseclass__c)###子类实例+下划线+类名+变量名访问
print (object2._Baseclass__f)###子类实例+下划线+类名+变量名访问
print "******6666***********"
print Subclass.a
print Subclass._b
# print Baseclass.d ##########类不能访问实例属性
# print Baseclass._e ##########类不能访问实例属性
print "######77777###########"