python继承

# 子类拥有父类非私有属性的使用权
# type和object类的关系   type是所有类的元类(包括object),object是所有类的父类(包括type)

# 子类不能继承父类的私有属性和私有方法
# python3中的单继承采用就近原则,多继承体系分为 无重叠的多继承和有重叠的多继承
# 无重叠的多继承采用深度优先原则(C3算法),重叠的多继承(菱形继承)采用广度优先原则,重写可用
# 资源的覆盖,其实就是资源优先级高的覆盖掉了优先级低的
# 子类中调用了父类的方法,则传递的self和cls都指向子类

# __init__方法的资源累加问题

class A:
    a = 1

    def __init__(self):
        self.aa = 2

    pass


class B(A):
    # 想在子类的init方法中新增一些属性
    def __init__(self):
        super().__init__()
        self.b = 3

    pass


b = B()
# b中并无a属性,但是有父类中变量a的使用权
print(b.a)
# 由于父类中的init方法中的self实际指向的是子类对象,实际上执行的是在子类内部添加了一个实例属性aa
print(b.__dict__)
# 尝试访问子类中新增的属性,以及从父类中继承的属性
print(b.b)
# 由于子类中具备了自己的init方法,将会重写父类中的init,此时将不在具备aa属性
# print(b.aa)  这一行报错 AttributeError: 'B' object has no attribute 'aa'
# 可是既想保存A中属性,又想拥有自己新增的属性,该怎么做呢?super可以沿着MRO链条引用上一级(菱形继承,并不一定是父类)的属性
print(b.aa)  # 此时会将上级的init方法设置的资源传递过来

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。