python 的继承与多态

来源:互联网 发布:我没有说话 知乎 编辑:程序博客网 时间:2024/06/10 07:48

有如下代码:

class A(object):    def __init__(self):        print "A:",self        super(A,self).__init__()    def fun_A1(self):        print "fun_A1"        self._fun_A2()    def _fun_A2(self):        print "fun_A2"class B(A):    def __init__(self):        print "B:",self        super(B,self).__init__()    def _fun_A2(self):        print "fun_B2"ins = B()ins.fun_A1()


执行结果:

B: <__main__.B object at 0x000000000267D470>
A: <__main__.B object at 0x000000000267D470>
fun_A1
fun_B2


可见在 A,B中的 self 为同一对象。B 重写了 A 的  _fun_A2 方法,实现了多态。

将上面的代码稍微改一下,将函数以双下划线开头命名。

class A(object):    def __init__(self):        print "A:",self        super(A,self).__init__()    def fun_A1(self):        print "fun_A1"        self.__fun_A2()    def __fun_A2(self):        print "fun_A2"class B(A):    def __init__(self):        print "B:",self        super(B,self).__init__()    def __fun_A2(self):        print "fun_B2"ins = B()ins.fun_A1()
输出为:

B: <__main__.B object at 0x000000000269D470>
A: <__main__.B object at 0x000000000269D470>
fun_A1
fun_A2

为什么 __fun_A2 方法没有被覆盖呢?

这涉及到 python 中的私有成员函数。python 将以 “__” 开头的方法当作私有方法。这类方法的存储名称并不是函数名本身,而是 _类名方法名。A 中 __fun_A2的存储名称为 _A__fun_A2,B 中的为_B__fun_A2。所以 类 A 中的 fun_A1 调用的实际上是   _A__fun_A2 函数。如果 A 中没有  __fun_A2 方法定义,则会出现如下错误:

B: <__main__.B object at 0x0000000001CE7E80>
Traceback (most recent call last):
A: <__main__.B object at 0x0000000001CE7E80>
  File "D:/��Ŀ/��������/sourcecode_official/beibei_cloud/beibei-cloud-config/src/test/test_cls.py", line 26, in <module>
fun_A1
    ins.fun_A1()
  File "D:/��Ŀ/��������/sourcecode_official/beibei_cloud/beibei-cloud-config/src/test/test_cls.py", line 9, in fun_A1
    self.__fun_A2()
AttributeError: 'B' object has no attribute '_A__fun_A2'


可见,类的私有成员函数不能被子类复写。



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 八字没有正财怎么办 八字无根怎么办啊 开车撞死一条狗怎么办 小麦收割机滚筒轴老折怎么办 圆珠笔画白墙上怎么办 白墙上圆珠笔怎么办洗 按扣皮箱扣不上怎么办 拉链一边掉了怎么办 拉链一半掉了怎么办 去北戴河怎么办安检证 电脑空格键打字失灵怎么办 国外玩游戏延迟怎么办 韩服lol要求输韩文怎么办 智齿碰到牙神经怎么办 合影中有人去世怎么办 在家中遇到蛇怎么办 去澳门手机充电怎么办 商标撕下来胶怎么办 商标被提出异议怎么办 商标被别人用怎么办 商标申请不下来怎么办 注册商标有近似商标怎么办 电话话打不通怎么办 公司卖了商标怎么办 商标撕不下来怎么办 商标撕不下来时怎么办 商标还没下来怎么办 商标揭不下来怎么办 手机程序出现异常怎么办 公众号企业名称是*怎么办 家人生命受到威胁怎么办 海淘看不懂英文怎么办 对英语不感兴趣怎么办 装修无合同起诉怎么办 上海离职后档案怎么办 公司注销了银行帐户怎么办 360借条注销了怎么办 注销营业执照公章丢失怎么办 工厂招聘信息有假怎么办 个体餐饮怎么办核名 见父母后接下来怎么办