python 类 单下划线,双下划线,子类重写父类方法

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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值