zoukankan      html  css  js  c++  java
  • 面向对象之继承

     

    1、继承的好处

    # 节省代码
    # 提高效率
    # 让类之间产生关联。
    示例:
    class Animal:
        def __init__(self, kind, age, sex):
            self.kind = kind
            self.age = age
            self.sex = sex
    
    class Person(Animal):
        pass
    
    class Dog(Animal):
        pass
    
    class Cat(Animal):
        pass
    
    p1 = Person('黄色人种', 25, '')
    print(p1.__dict__)

     

    2、继承的分类

    如上:

    # Animal 父类,基类
    # Person 子类,派生类
    # 继承:单继承,多继承。

    # 类:经典类,新式类
        # 经典类:不继承object的类。
        # 新式类: 继承object的类。
        # python2x 经典类 新式类(object) 共存。#了解 新式类需要在类名后面加上(object)
    # python3x 默认继承object 全部都是新式类。
    区别在于:多继承的时候,查询的顺序不同。新式类比经典类查询效率要高。
    class A:
      pass
    a1 =A()
    会报错吗?我这个对象必须要找到__init__方法。
    答案是不报错。这个是因为python3用的都是新式类。其实所有类都继承object类。点击去object类找到__init__方法。

    2.1 单继承

    class Animal:
        a1 = '太白'
        def __init__(self, kind, age, sex):
            self.kind = kind
            self.age = age
            self.sex = sex
    
        def func1(self):
            print(666)
    
    class Person(Animal):
        # a1 = 'alex'
        pass
    
    # 类名
    print(Person.a1)
    # Person.func1(123) 一般类名不调用方法
    需求:子类有自己的属性,我如何既要执行父类的属性或方法,又要执行子类或方法。
    class Animal:
    
        def __init__(self, kind, age, sex):
            self.kind = kind
            self.age = age
            self.sex = sex
    
        def bark(self):
            print('动物都会叫')
    class Dog(Animal):   #Animal去掉也能执行。 
        def __init__(self, k1,a1,s1,bite):
            '''
            self = d1
            k1 = '藏獒'
            ....
            '''
            # Animal.__init__(self, k1, a1, s1)  #第一种: Animal.__init__(self, k1, a1, s1) 直接调用另一个类的方法

         super().__init__(k1,a1,s1) #第二种:自动将self传给父类的self,不用你自己传了 self.bite
    = bite def bark(self): print('汪汪汪') class Cat(Animal): def bark(self): print('喵喵喵') class chick(Animal): def bark(self): print('大爷,来玩呀') d1 = Dog('藏獒', 3, '', 300) print(d1.__dict__)

    两种解决方式解决既要执行子类的方法,又要执行父类的方法
    第一种 Animal.__init__(self, k1, a1, s1) 直接调用另一个类的方法
    第二种:super().__init__(k1,a1,s1) # 自动将self传给父类的self




    d1.bark()

    先执行父类,在执行子类。

    发现都执行了。

    2.2、多继承

    # 新式类:C3算法 mro 主要是查询 新式类的多继承的继承顺顺序
    通过mro查看继承顺序
    class A:
        def func(self):
            print(666)
        pass
    
    class B:
        def func(self):
            print(666)
        pass
    
    class C(A):
        def func(self):
            print(666)
        pass
    
    class D(B):
        def func(self):
            print(666)
        pass
    
    class E(C,D):
        # def func(self):
        #     print(666)
        pass
    #
    e1 = E()
    e1.func()
    
    print(E.mro())

     

     单继承其他示例:

    # 单继承
    
    class A:
        name = 'alex'
        def func(self):
            print('IN A')
    
    class B(A):
    
        name = '太白'
    
        def func(self):
            # self = obj
            A.func(self)
            # print('IN b')
            super().func()   
    
    obj = B()
    # obj.name
    obj.func()

     

  • 相关阅读:
    sql 存储过程
    Chrome系列 Failed to load resource: net::ERR_CACHE_MISS
    oledb 操作 excel
    [转]基于SQL脚本将数据库表及字段提取为C#中的类
    Ul li 竖排 菜单
    JS判断checkbox至少选择一项
    JS 字符串转日期格式 日期格式化字符串
    setInterval 实时驱动界面改变
    Let's Format Css Documents
    Web颜色搭配
  • 原文地址:https://www.cnblogs.com/wangkaiok/p/9950170.html
Copyright © 2011-2022 走看看