zoukankan      html  css  js  c++  java
  • Day20

    1、继承和派生

    class Animal:
        def __init__(self,name,hp,ad):
            self.name = name     # 对象属性 属性
            self.hp = hp         #血量
            self.ad = ad         #攻击力
        def eat(self):
            print('eating in Animal')
            self.hp += 20
    
    class Person(Animal):
        def __init__(self,name,hp,ad,sex):        # 重写
            # Animal.__init__(self,name,hp,ad)
            # super(Person,self).__init__(name,hp,ad)   # 在单继承中,super负责找到当前类所在的父类,在这个时候不需要再手动传self
            super().__init__(name,hp,ad)   # 在单继承中,super负责找到当前类所在的父类,在这个时候不需要再手动传self
            self.sex = sex      # 派生属性
            self.money = 100
        def attack(self,dog):   # 派生方法
            print("%s攻击了%s"%(self.name,dog.name))
        def eat(self):                         # 重写
            super().eat()  # 在类内 使用 super()方法找父类的方法
            print('eating in Person')
            self.money -= 50
    
    class Dog(Animal):
        def __init__(self,name,hp,ad,kind):
            Animal.__init__(self,name,hp,ad)
            self.kind = kind    # 派生属性
        def bite(self,person):  # 派生方法
            print("%s咬了%s" % (self.name, person.name))
    
    # 人 sex
    alex = Person('alex',100,10,'female')   # 实例化
    print(alex.__dict__)
    
    # 父类有eat 子类没有
    # alex.eat() # 找父类的
    # 子类有eat 不管父类中有没有
    # alex.eat() # 找子类的
    # 当子类中有,但是我想要调父类的
    # Animal.eat(alex)          #指名道姓
    # super(Person,alex).eat()  # super(子类名,子类对象)方法   —— 一般不用
    # 子类父类都有eat方法,我想执行父类的eat和子类的eat
    alex.eat()  # 执行子类的eat
    print(alex.__dict__)
    #
    # 对象
    # Person.attack(alex)   # alex.attack()
    
    # 狗 kind
    # tg = Dog('到哥',100,50,'藏獒')
    # print(tg.__dict__)

    2、钻石继承问题

    # 多继承
    class A:
        def func(self):
            print('A')
    class B(A):
        def func(self):
            print('B')
    class C(A):
        def func(self):
            print('C')
    class D(B):
        def func(self):
            print('D')
    class E(B,C):
        def func(self):
            print('E')
    class F(D,E):
        def func(self):
            print('F')
    f = F()
    f.func()
    print(F.mro())  # 广度优先的遍历顺序

    #新式类 多继承 寻找名字的顺序 遵循广度优先
    class A:
        def func(self):
            print('A')
    class B(A):
        def func(self):
            super().func()
            print('B')
    class C(A):
        def func(self):
            super().func()
            print('C')
    class D(B,C):
        def func(self):
            super().func()   # B
            print('D')
    
    d = D()
    d.func()

       

    # super():
        # 在单继承中就是单纯的寻找父类
        # 在多继承中就是根据子节点 所在图 的 mro顺序找寻下一个类
    # 遇到多继承和super
        # 对象.方法
            # 找到这个对象对应的类
            # 将这个类的所有父类都找到画成一个图
            # 根据图写出广度优先的顺序
            # 再看代码,看代码的时候要根据广度优先顺序图来找对应的super
    coding:utf-8
    class A:
        def func(self):
            print('A')
    class B(A):
        def func(self):
            print('B')
    class C(A):
        def func(self):
            print('C')
    class D(B,C):
        def func(self):
            print('D')

    # 经典类 :在python2.*版本才存在,且必须不继承object
        # 遍历的时候遵循深度优先算法
        # 没有mro方法
        # 没有super()方法
    # 新式类 :在python2.X的版本中,需要继承object才是新式类
        # 遍历的时候遵循广度优先算法
        # 在新式类中,有mro方法
        # 有super方法,但是在2.X版本的解释器中,必须传参数(子类名,子类对象)
  • 相关阅读:
    edu_6_1_4
    edu_6_1_2
    edu_6_1_3
    edu_6_1_1
    音乐链接
    音乐推荐界面
    客服页面
    购物页面
    京东读书新闻资讯页面
    安装Tomcat时 ,设置JAVA_HOME和JRE_HOME
  • 原文地址:https://www.cnblogs.com/a352735549/p/8820701.html
Copyright © 2011-2022 走看看