面向对象 - 继承性

面向对象 - 继承性

# cheer_xiong
# (`・ω・´) python

# IDE:就是用啥软件开发


# 继承
"""
就是新建类的一种方式,继承了一个类,类中的属性和方法就在子类中
父类/基类
子类/派生类
新式类 : 只要继承了object类,就是新式类,在py3中,默认都继承object类
        在py2中,需要显示指定继承object
经典类 : 没有继承object类,就是经典类
            py3中没有经典类
            py2中才有
继承介绍:
    如何使用继承
        class 类名(父类)
            pass
        新式类和经典类

    利用继承减少代码冗余
        # 相同属性可以定义一个父类用来给其他子类调用,减少代码行数
        # 并且调用还是和之前一样
    重用父类查找方式一:
        涉及到属性查找顺序 先找对象,对象没有去类中,找不到去父类,找不到就报错
        但是涉及到多个父类继承,这个就引出以下
            |
    重用父类查找方式二:
        类实例化就会自动调用__init__,如果没有,就去父类中找
        多层继承:
                class A:
                    a = 'aaa'
                class B(A):
                    a = 'bbb'
                class C(B):
                    a = 'ccc'
                class D():
                    pass
                # 往上一集查找
        多继承:
                class A:
                    a = 'aaa'
                class B:
                    a = 'bbb'
                class C:
                    a = 'ccc'
                class D(A,B,C):
                    pass

                # A->B->C 根据从左到右找

        # 继承的菱形问题:
        新式类和经典类是不一样的
        *必须都继承一个类,并且不是object类,构成一个菱形*
        新式类:广度优先,最后一个先不找,去找其他的,最后找最后一个
        经典类:深度优先,一条道找到底

        # mro 列表,继承顺序查找列表(只在新式类中有)
        print(类名.mro())
        print(类名.__mro__)   # 相同

        重用父类方法的第一种方式:
            第一种方法和定义父类没有多大关系,因为定不定一都可以使用 指名道姓 的方式调用
            和继承没有关系
            class A:
                def __init__(self, name, age):
                    self.name = name
                    self.age = age

            class B:
                def __init__(self, name, age, price):
                    A.__init__(self, name, age)
                    self.price = price

            b = B('xc', 18, 100)
            print(b.name)
            print(b.age)
        重用父类方法的第二种方式:
            使用super(),需要继承父类才能调用父类的元素,
            还有一点就是super是严格按照 mro 来找元素了。
            class A:
                def __init__(self, name, age):
                    self.name = name
                    self.age = age

            class B(A):
                def __init__(self, name, age, price):
                    super().__init__(name, age)
                    self.price = price

            b = B('xc', 18, 100)
            print(b.name)
            print(b.age)





"""



posted @ 2019-08-27 16:03  cheerxiong  阅读(204)  评论(0编辑  收藏  举报