Python之旅——带着决心出发(第9步)

本文探讨了Python中类继承的属性搜索规则,包括单继承和多继承情况下属性的查找顺序,并通过具体代码示例说明了子类如何覆盖父类属性及多继承中属性的覆盖现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、基础篇

10. 类继承属性搜索规则

规则:

    根据类的继承关系树,自底向上,自左向右搜索,直到找到第一个属性为止。(如果未找到,抛出异常)

图片来自:《Learning Python 5th Edition》一书Figure 26-1

例如:C1继承C2和C3两个类,那么C1类的对象I1对某个属性的访问,搜索路径

      I1.name : I1;
      I1.x    : I1->C1;
      I1.y    : I1->C1;
      I1.z    : I1->C1->C2;
      I1.w    : I1->C1->C2->C3;


从Python的搜索路径来看:
①子类定义了与父类相同的属性,那么通过对象访问的方式,子类将覆盖父类的属性;

②存在多继承且各父类中存在相同的属性(图中的C2和C3的z)时,“左边”的父类将覆盖“右边”的父类。

代码举例:

class C2(object):
def __init__(self):
self.x = 10
self.z = 20

class C3(object):
def __init__(self):
self.w = 15
self.z = 25

class C1(C2, C3):
def __init__(self):
C3.__init__(self)
C2.__init__(self)
self.x = 12
self.y = 13
if __name__ == "__main__":
I1 = C1()
I1.m = 33
print("I1.m", I1.m)
print("I1.x", I1.x)
print("I1.y", I1.y)
print("I1.z", I1.z)
print("I1.w", I1.w)


输出结果:

I1.m 33
I1.x 12
I1.y 13
I1.z 20

I1.w 15


疑问:

1.如果将C3.__init__(self)和C2.__init__(self)两行语句交换,则输出结果:

I1.m 33
I1.x 12
I1.y 13
I1.z 25
I1.w 15

猜想:这两行语句决定了多继承中,父类中的“左”和“右”?该如何理解?

2.如果将C3.__init__(self)和C2.__init__(self)两行语句删除,将会报告如下错误:

AttributeError: 'C1' object has no attribute 'z'

猜想:这两行语句决定了子类是否继承父类中的属性?





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值