zoukankan      html  css  js  c++  java
  • day 17

    今日内容大纲

    01昨日内容回顾

    02作业讲解

    03继承

    继承

    面向对象三大特征:继承,封装,多态

    在OOP(Object Oriented Programming)程序设计中,当我们定义一个class的时候,可以从某个现有的class 继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。

    class Animal:
        def __init__(self,name,sex,age):
            self.name=name
            self.sex=sex
            self.age=age
    
        def eat(self):
            print('都会吃。。。')
    
    class Person(Animal):
        pass

    p1=Person('alex','male',20)
    p2=Animal('jinxing','male',18)
    p1.eat()      #子类以及子类实例化的对象可以访问父类的任何方法和变量
    print(p1.name)  #结果是:alex

    Person.eat(11)  #类名可以访问父类的所有内容

    继承有什么好处?最大的好处是子类获得了父类的全部属性及功能。上述例子中Person继承了Animal,则Person中就可以直接使用Animal中的eat方法

    在实例化一个Person的时候,子类继承了父类的构造函数,就需要提供父类三个属性变量name,sex和age

    继承还可以一级一级的继承

    问题来了:子类中有一个eat方法,父类中也有一个eat方法,那么在实例化对象之后调用eat方法到底是子类中的还是父类中的呢?我想既要执行子类的方法,又要执行父类的方法,该怎么做?

    上节课讲的查询顺序我们可以知道,实例化一个Person对象的时候,用那个实例化出来的对象通过.来调用时,会先从子类中查找eat方法,子类中没有再从父类查找

    代码如下:

    class Animal:
        def __init__(self,name,sex,age):
            self.name=name
            self.sex=sex
            self.age=age
    
        def eat(self):
            print('都会吃。。。')
    
    class Person(Animal):
        def eat(self):
            #1.Animal.eat(self)
            #2.super().eat()
            print('人吃东西...')
    
    p1 = Person('jiang','male',20)
    p1.eat()
        

    有两种方法可以解决,第一种是在子类的eat方法中添加Animal.eat(self).这时就会先调用父类的eat方法

    第二种是在子类的eat方法中添加super().eat()。功能一样但是一般用这种方法

    问题二:动物有些属是特有的,该如何添加这些特有的属性?

    代码如下:

    class Animal:
        def __init__(self,name,sex,age):
            self.name=name
            self.sex=sex
            self.age=age
        def eat(self):
            print('都能吃')
        def drink(self):
            print('都能喝')
    class Dog(Animal):
        def hit(self):
            print('狗会咬人')
    
    class Bird(Animal):
        def __init__(self,name,sex,age,wing):#self接收的是b1对象
            #Animal.__init__(self,name,sex,age) #一般不用这种方法
            super(Bird,self).__init__(name,sex,age)#super().__init__(name,sex,age)
            self.wing=wing
        def miao(self):
            print('嗷嗷叫')
    
        def eat(self):
            #super().eat()
            #Animal.eat(self)
            print('%s会吃...'%self.name)
    
    #既要执行子类的方法,又要执行父类的方法
     #1.#Animal.__init__(self,name,sex,age)
     #2.super().__init__(name,sex,age)
    b1 = Bird('鹦鹉','',10,'绿翅膀')
    继承的进阶:
    #类:经典类,新式类
    #新式类:凡是继承object类都是新式类
    #python3中,所有的类都是新式类
    #因为python3中的类都默认继承object

    #经典类:不继承object类都是经典类(python3中不存在)
    #python2中既有新式类,又有经典类,所有的类默认都不继承object,所有的类默认都是经典类


    #单继承:新式类,经典类查询顺序一样
    #多继承:
    #新式类:遵循广度优先
    #经典类:遵循深度优先
    #多继承的新式类  广度优先
    
    class A:
        def func(self):
            print('IN A')
    class B(A):
        pass
        #def func(self):
            #print('IN B')
    class C(A):
        pass
        #def func(self):
            #print('IN C')
    class D(B):
        pass
        #def func(self):
            #print('IN D')
    class E(C):
        #pass
        def func(self):
            print('IN E')
    class F(D,E,C):
        pass
    
    f1 = F()
    f1.func()
    print(F.mro())  #可以查询类的继承顺序
    广度优先:F->D->B->E->C->A
    #多继承的经典类    深度优先:一条路走到底
  • 相关阅读:
    web学生选课平台
    YUM仓库的搭建
    定制RPM包
    会话保持
    Nginx负载均衡器+keepalived
    LAMP搭建配置
    KVM安装搭建
    安装PHP以及搭建博客(四)伪静态
    安装PHP以及搭建博客(三)服务迁移分离
    安装PHP以及搭建博客(二)
  • 原文地址:https://www.cnblogs.com/hongweijiang/p/10862676.html
Copyright © 2011-2022 走看看