1.类中前置双下划线__
表示私有的,内部不允许访问,意思是只有类对象自己能访问,连子类对象也不能访问。
双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_类名__name,所以,仍然可以通过_类名__name来访问__name变量。
2.类中前置
单下划线_ 开始的成员变量叫做保护变量,意思是只有类对象和子类对象自己能访问到这些变量;
前置下划线的变量和方法代表这个变量和方法最好是只在类内部使用。意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”
3.前后置双下划线,这样的方法会在类或对象的某些事件触发后执行,
例如对象的实例化会执行__init__()方法,属性初始化。删除对象的一个属性的时候会触发__delattr__方法 等
举例:
class Foo_father(object):
def __init__(self):
self.x = 100
self._bar()
self.__bar() #此行调用父类私有方法__bar
def _bar(self):
self.x += 2000
print('father _bar',self.x)
def __bar(self): #私有方法,不会被重写
self.x += 3000
print('father __bar',self.x)
class Foo_children(Foo_father):
def __init__(self):
super(Foo_children, self).__init__() #调用父类__init__,通过super可继承父类属性方法
self._bar() #执行子类方法_bar
self.__bar() #执行子类私有方法__bar
def _bar(self): #重写父类的方法
self.x += 1
print('children _bar', self.x)
return self.x
def __bar(self): #私有方法
self.x += 2
print('children __bar', self.x)
f = Foo_children() #初始化子类__init__
f._bar()
打印结果:
children _bar 101 #初始化子类__init__,调用父类__init__, 父类self._bar() 调用子类的_bar方法,打印出children _bar 101
father __bar 3101 #父类self.__bar() ,此行调用父类私有方法__bar,打印出father __bar 3101
children _bar 3102 #self._bar执行子类方法_bar() ,打印出 children _bar 3102
children __bar 3104 # self.__bar() 执行子类私有方法__bar,打印出children __bar 3104
children _bar 3105 #通过实例f,调用方法_bar,children _bar 3105
f = Foo_children()
f.__bar()
结果如下:
可以通过_类名__name 来调用私有方法
f = Foo_children()
f._Foo_children__bar()
结果如下
children _bar 101
father __bar 3101
children _bar 3102
children __bar 3104
children __bar 3106 #执行了f._Foo_children__bar()
可构建一个父类方法来调用父类属性方法,
g = Foo_father()
g._bar()
g._Foo_father__bar()
结果如下:
father _bar 2100 #父类方法未被子类重写
father __bar 5100
father _bar 7100
father __bar 10100