第一阶段:Python开发基础 day24 面向对对象三大特性之继承

上节课内容回顾

    -类与对象
          -对象有:数据属性(变量),方法属性(方法)
          -对象中可以嵌套对象
          -往对象中放属性的方式
              -__init__
              -对象.属性
              -对象.方法   在方法中放属性
-属性查找顺序
          -先从对象中找----去类中找---报错
-__init__
          -类加括号完成实例化,会自动调用
-绑定方法
          -类来调用:普通函数,有几个参数就要传几个参数
          -对象来调用:不需要传第一个参数(第一个参数名字不一定叫self)
-一切皆对象
          -python中一切皆对象
              #一切皆对象
              ll=[1,2]
              #对象来调用
              ll.append(5)
              #类来调用
              list.append(ll,5)
          -不重要 函数也是对象
              def test():
                  print('xxxx')
              test.name="lqz"
              print(test.name)
-小例子

本节课主要学习内容--三大特性之继承

一、什么是继承

什么是继承:
    ---是一种新建类的方式,继承了一个类,类中的属性和方法就在子类中
    --父类/基类
    --子类/派生类
    --新式类:只要继承了object类,就是新式类,再python3中,默认继承object类
        -Python3中:默认继承object
            class A:
                pass
        -python2中,需要显示的指定继承object
    --经典类:没有继承object的类,就是经典类
        -python3中没有经典类
        -python2中才有

二、如何使用继承

class A(object):
    pass
class C:
    pass
#B继承了A这个类
class B(A,C):
    pass
#类的其他内置属性 __名字__
print(B.__dict__)
#类名
print(B.__name__)
#B的父类
print(B.__bases__)

print(C.__bases__)

三、使用继承的好处

利用继承减少代码冗余

四、继承重用父类的两种方法

方法一:-指名道姓的使用

跟继承没有关系

示例:

class A:
    def __init__(self,name,age):
        self.name=name
        self.age=age
class Person:
    school = 'oldboy'
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def study(self):
        print('study....')

class Teacher(Person):

    def __init__(self,name,age,level):
        A.__init__(self,name,age)
        # self.name=name
        # self.age=age
        self.level=level

class Student(Person):
    school = 'yyyy'
    def __init__(self,name,age,course):
        #如何重用父类的__init__方法
        Person.__init__(self,name,age)
        self.course=course
    def study(self):
        Person.study(self)
        print("%s学生在学习"%self.name)


stu1=Student('wed',19,"Python")
# stu1.school='xxx'
print(stu1.school)
stu1.study()

方法二:通过super关键字

跟继承就有关系了

示例:

class Person(object):
    school = 'oldboy'
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def study(self):
        print('study....')

class Student(Person):
    school = 'yyyy'
    def __init__(self,name,age,course):
        #super() 会按照mro列表拿到父类对象
        #对象来调用绑定方法,不需要传递第一个参数(self)
        super().__init__(name,age)
        #经典类和新式类
        #经典类中必须这么写(py3中没有经典类),都用上面那种方式写
        # super(Student,self).__init__(name,age)
        self.course=course
    def study(self):
        # Person.study(self)
        super().study()
        # print("%s学生在学习"%self.name)


stu1=Student('wed',19,"Python")
# stu1.school='xxx'
# print(stu1.school)
stu1.study()

五、继承属性查找顺序

菱形问题

根据mro列表查找

#继承的菱形问题:新式类和经典类的查找顺序是不一样的
#新式类的查找属性:广度优先
#经典类:深度优先
# class G(object):
#     a = "GGG"
#     pass
# class F(G):
#     # a = "FFF"
#     pass
# class E(G):
#     # a = "EEE"
#     pass
# class D(G):
#     # a = "DDD"
#     pass
# class C(F):
#     # a="CCC"
#     pass
# class B(E):
#     # a="BBB"
#     pass
# class A(B,C,D):
#     # a="AAAA"
#     pass
#
# a=A()
# print(a.a)

class G(object):
    a = "GGG"
    pass
class F(G):
    # a = "FFF"
    pass
class E(G):
    # a = "EEE"
    pass
class D(G):
    # a = "DDD"
    pass
class C(F):
    # a="CCC"
    pass
class B(E):
    # a="BBB"
    pass
class A(B,C,D):
    # a="AAAA"
    pass

a=A()
print(a.a)
#mro 列表,继承顺序查找列表(只在新式类中有)1
print(A.mro())
print(A.__mro__)
#继承的菱形问题(显示的都继承一个类,不是object类):新式类和经典类的查找顺序是不一样的
#新式类(py3中全是新式类):广度优先---从左侧开始,一直往上找,找到菱形的顶点结束(不包括菱形顶点),继续下一个继承的父类往上找,找到菱形的顶点结束(不包括菱形顶点),最后找到菱形顶点
#经典类(只有py2中才有):深度优先---从左侧开始,一直往上找,找到菱形的顶点结束(包括菱形顶点)继续下一个继承的父类往上找,找到菱形的顶点结束(不包含菱形定点)

#不出现菱形问题:正常查找

今日总结

暂无

posted @ 2019-08-27 16:55  foreversun92  阅读(193)  评论(0编辑  收藏  举报