zoukankan      html  css  js  c++  java
  • python面向对象(三)之继承

    继承

    介绍

      继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。继承即常说的is-a关系。子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。或子类从父类继承方法,使得子类具有父类相同的行为。

     例子:
      比如可以先定义一个类叫车,车有以下属性:车体大小,颜色,方向盘,轮胎,而又由车这个类派生出轿车和卡车两个类,为轿车添加一个小后备箱,而为卡车添加一个大货箱。

     继承所表达的就是一种对象类之间的相交关系,它使得某类对象可以继承另外一类对象的数据成员和成员方法。若类B继承类A,则属于B的对象便具有类A的全部或部分性质(数据属性)和功能(操作),我们称被继承的类A为基类、父类或超类,而称继承类B为A的派生类或子类。

     表示父类和子类的术语:父类和子类、超类和子类、基类和派生类,他们表示的是同一个意思。

    为什么需要继承

      开发动物类,其中动物分别为企鹅以及老鼠,要求如下:
      企鹅:属性(姓名,id),方法(吃,睡,自我介绍)
      老鼠:属性(姓名,id),方法(吃,睡,自我介绍)
    企鹅和老鼠都是动物我们是不是可以写一个动物类,这样代码是不是简洁了许多。有的人说我就想单独建两个类写这个属性,我只能告诉你可以,但这好比,你父亲给你了几百万,你偏不要,把这些钱扔了非要自己去挣,你想这样我也没办法。既然java给我们提供了继承我们就要好好用这样会大大提高我们的开发效率,比如:维护性提高了,代码也更加简洁,提高代码的复用性也提高了(复用性指可以多次使用,不用再多次写同样的代码)。

    作用:

      1、继承可以减少重复的代码。比如父类已经提供的方法,子类可以直接使用,不必再去实现。

      2、继承是多态性的前提。当然使用继承的同时也提高了类的耦合度。

      当你不需要父类的属性时,可以覆盖调原属性。

    python继承

       继承分为多继承和单继承,而python就属于多继承。python也和java有些区别,在这里也说一下

    特点:

    ​ 1:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的,新式类的基类默认是有object的,同时基类右多个的话就为多继承

    ​ 2:在继承中基类的构造(init()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。有别于java,java是自动调用初始化方法的。

      3:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数

      4:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

    初始化

      第一种方法:基类名.__init__(self,arg)

    class A(object): # 新式类
        """基类"""
        def __init__(self, name, age):
            # super(A, self).__init__()
            self.name = name
            self.age = age
    
            
    class B(object):
        """基类"""
    
        def __init__(self, height):
            self.height=height
            
    class C(A):
        """继承一个,单继承"""
        def __init__(self, name, age, sex):
            A.__init__(self, name, age) #第一种方法
            self.sex = sex
    
    class D(A,B):
        """继承一个,单继承"""
        def __init__(self, name, age, sex,height):
            A.__init__(self, name, age) #第一种方法
            B.__init__(self, height)
            self.sex = sex
    

    第二种方法:supper关键字 即 supper(obj,self).__init__(arg)

    class A(object): # 新式类
        """基类"""
        def __init__(self, name, age):
            super(A, self).__init__()
            self.name = name
            self.age = age
    
            
    class B(object):
        """基类"""
    
        def __init__(self, height):
            self.height=height
            
    class C(A):
        """继承一个,单继承"""
        def __init__(self, name, age, sex):
            super(C, self).__init__(name, age)  #第二种方法
            self.sex = sex
    
    class D(A,B):
        """继承一个,单继承"""
        def __init__(self, name, age, sex,height):
            super(D, self).__init__(name, age) #第二种方法
            # 使用此方法只能初始化第一个基类,第二个基类如果有不一样的参数就无法初始化,建议使用第一种
            self.sex = sex
    

    注:单继承时推荐第二种,多继承时使用第一种

    多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。java的多继承是通过实现多个接口实现的。

    isinstance(a,b)

    可以判断判断一个变量的类型,可以用来判断a是否为b的实例对象,返回True或False

    type()

    函数获取变量的类型,返回变量的类型

  • 相关阅读:
    优先级管理器 IPriorityManager -- ESBasic 可复用的.NET类库(14)
    对象获取器IObjectRetriever -- ESBasic 可复用的.NET类库(17)
    定时刷新缓存管理器 IRefreshableCacheManager --ESBasic 可复用的.NET类库(16)
    TopN排行榜容器 TopNOrderedContainer -- ESBasic 可复用的.NET类库(20)
    回调定时器ICallbackTimer --ESBasic 可复用的.NET类库(07)
    Linux kernel data types, alignment, compat_ioctl 数据类型,对齐问题和compat_ioctl
    ubnutu开启daytime服务
    从长春到深圳“一个人的旅行”第二篇
    多客户模式

  • 原文地址:https://www.cnblogs.com/yangliguo/p/8007303.html
Copyright © 2011-2022 走看看