如果寂静定义了Person类,需要定义新的Student 和Teacher 类时
    可以直接从Person 中继承
    class Person(Object):
      def __init__(self,name,gender):
        self.name = name
        self.gender = gender
    定义 Student 类时,只需要把额外的属性加上,例如:score
        class Student(Person):
          def __init__(self,name,gender,score):
          super(Student,self).__init__(name,gender)
          self.score = score
          一定要用 super(Student, self).__init__(name, gender) 
          去初始化父类,否则,继承自 Person 的 Student 将没
          有 name 和 gender。
          函数super(Student, self)将返回当前类继承的父类,
          即 Person ,然后调用__init__()方法,注意self参数已在
          super()中传入,在__init__()中将隐式传递,不需要写出(也不能写)。
 

python 中判断类型
    函数isinstance() 可以判断一个变量的类型,既可以用函数内置的数据类型如str,
    list, dict,也可以用在我们自定义的类型,它们本质上数据类型。
    假如有如下的 Person, Student 和 Teacher 的定义及继承关系。
    class Person(object):
      def __init__(self, name, gender):
        self.name = name
        self.gender = gender
    

    class Student(Person):
       def __init__(self, name, gender, score):
         super(Student, self).__init__(name, gender)
        self.score = score
    class Teacher(Person):
       def __init__(self, name, gender, course):
        super(Teacher, self).__init__(name, gender)
        self.course = course
        p = Person('Tim', 'Male')
        s = Student('Bob', 'Male', 88)
        t = Teacher('Alice', 'Female', 'English')
    当我们拿到变量 p、s、t 时,可以使用 isinstance 判断类型:
        isinstance(p, Person)
          True # p是Person类型
        isinstance(p, Student)
          False # p不是Student类型
    我们再考察 s :
        isinstance(s, Person)
          True # s是Person类型
        isinstance(s, Student)
          # s是Student类型
        isinstance(s, Teacher)
          False # s不是Teacher类型
      s 是Student类型,不是Teacher类型,这很容易理解。但是,s 也是
        Person类型,因为Student继承自Person,虽然它比Person多了一些
          属性和方法,但是,把 s 看成Person的实例也是可以的。
        这说明在一条继承链上,一个实例可以看成它本身的类型,
      也可以看成它父类的类型。
python 中多态
    类具有继承关系,并且子类类型可以向上转型看做符类型,如果我们从Person
    派生出 Student 和Teacher, 并都写了一个who Aml() 方法
      class Person(object):
         def __init__(self, name, gender):
           self.name = name
          self.gender = gender
        def whoAmI(self):
           return 'I am a Person, my name is %s' % self.name
      class Student(Person):
        def __init__(self, name, gender, score):
           super(Student, self).__init__(name, gender)
             self.score = score def whoAmI(self):
               return 'I am a Student, my name is %s' % self.name
      class Teacher(Person):
         def __init__(self, name, gender, course):
          super(Teacher, self).__init__(name, gender)
          self.course = course def whoAmI(self):
            return 'I am a Teacher, my name is %s' % self.name
      在一个函数中,如果我们接收一个变量 x,则无论该 x 是 Person、Student还
        是 Teacher,都可以正确打印出结果:
        def who_am_i(x):
          print x.whoAmI() p = Person('Tim', 'Male')
            s = Student('Bob', 'Male', 88)
             t = Teacher('Alice', 'Female', 'English')
            who_am_i(p) who_am_i(s) who_am_i(t)
      运行结果:
        I am a Person, my name is Tim I am a Student, my name is Bob I am a Teacher, my name is Alice    
        这种行为称为多态。也就是说,方法调用将作用在 x 的实际类型上。s 是
        Student类型,它实际上拥有自己的 whoAmI()方法以及从 Person继承的
        whoAmI方法,但调用 s.whoAmI()总是先查找它自身的定义,如果没有定
        义,则顺着继承链向上查找,直到在某个父类中找到为止。
python 中多重继承
      除了从一个父类继承外,Python允许从多个父类继承,称为多重继承。
      多重继承的继承链就不是一棵树了,它像这样:
  

      class A(object):
        def __init__(self, a):
         print 'init A...' self.a = a
      class B(A):
        def __init__(self, a):
         super(B, self).__init__(a) print 'init B...'
      class C(A):
         def __init__(self, a):
        super(C, self).__init__(a) print 'init C...'
      class D(B, C):
        def __init__(self, a):
        super(D, self).__init__(a) print 'init D...'
    像这样,D 同时继承自 B 和 C,也就是 D 拥有了 A、B、C 的全部功能。多重继
    承通过 super()调用__init__()方法时,A 虽然被继承了两次,但__init__()只
      调用一次:
        d = D('d')
          init A...
          init C...
          init B...
           init D...
    

      多重继承的目的是从两种继承树中分别选择并继承出子类,以便组合功能使用。
python 中获取对象信息
    除了用 isinstance() 判断它是否是某种类型的实例外,还有没有别的方法获取到更多的信息呢?
      class Person(object):
        def __init__(self, name, gender):
          self.name = name self.gender = gender
        class Student(Person):
            def __init__(self, name, gender, score):
            super(Student, self).__init__(name, gender)
              self.score = score def whoAmI(self):
                 return 'I am a Student, my name is %s' % self.name
        首先可以用 type() 函数获取变量的类型,它返回一个 Type 对象:
            type(123)
            <type 'int'>

 

 

Python 基础 类的继承的更多相关文章

  1. python基础--类的继承以及mro

    继承: 什么是继承: 继承是一种关系,描述两个对象之间什么是什么的关系 在程序中,继承描述的是类和类之间的关系 例如 a继承了b,a就能直接使用b已经存在的方法和属性了 a称之为子类,b称之为父类,成 ...

  2. python基础-类的继承

    继承:承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”.“父类. 继承的过程,就是从一般到特殊的过程.要实现继承,可以通过“继承”(Inheritance)和“组合”(Compositio ...

  3. python基础——类和实例

    python基础——类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都 ...

  4. Python基础-类

    Python基础-类 @(Python)[python, python基础] 写在前面 如非特别说明,下文均基于Python3 摘要 本文重点讲述如何创建和使用Python类,绑定方法与非绑定方法的区 ...

  5. python基础之类的继承与派生、组合、接口与归一化设计、抽象类、子类中调用父类方法

    一.什么是继承 继承是一种创建新的类的方式,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. 派生:子类继承了父类的属性,然后衍生出自己新的属性,如果子类衍生出的新 ...

  6. python基础——类名称空间与对象(实例)名称空间

    python基础--类名称空间与对象(实例)名称空间 1 类名称空间 创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性 而类的良好总属性:数据属性和函数属性 其中类 ...

  7. Python 笔记 : 类和继承

    # -*- coding=  utf-8 -*- # 文件编码定义的语法规则是: coding[:=]/s*([-/w.]+) # 未指定编码将默认为 : ASCII # 同时要注意物理文件的编码也要 ...

  8. C#核心基础--类的继承

    继承 一个类可以继承自另一个类.在 C#中,类与类之间只存在单一继承.也就是说,一个类的直接基类只能有一个.当类与类之间实现继承的时候,子类可以将它的直接基类的所有成员当做自己的成员,除了类的静态构造 ...

  9. 【python】-- 类的继承(新式类/经典类)、多态

    继承 之前我们说到了类的公有属性和类的私有属性,其实就是类的封装,现在准备随笔的 是继承,是面向对象的第二大特性. 面向对象编程 (OOP) 语言的一个主要功能就是“继承”.继承是指这样一种能力:它可 ...

随机推荐

  1. SignalR实时通信

    /// <summary> /// Message集线器类 /// </summary> [HubName("chathub")] public class ...

  2. 【vue】混合模式

    因为工作的分配,写财务的对账部分,因为3个页面的设计和功能基本相同,都是查询筛选表格,所以用混合模式优化了部分代码.用混合把一些共用的东西抽离了出来. 具体使用方法参照文档. https://cn.v ...

  3. 如何在FineReport中解析数据库内XML文件

    在数据库表中,其中字段XML所存的为xml格式数据在表xmltest中.那么在使用该表进行报表制作时,需要将存于xml字段中的值读取出来作为报表数据源. XML每条记录数据格式如下: <Fiel ...

  4. Linux Swap扩容

    最近在做rac,在环境检查的时候发现swap空间检查不通过,所以我们第一想到的是对swap进行扩容,那么swap扩容有哪些方法呢?这里主要介绍两种方法,一通过添加额外磁盘,扩展swap分区,二是通过本 ...

  5. Effective C++(20) 继承与面向对象设计

    本文主要参考<Effective C++ 3rd>中的第六章部分章节的内容. 关注的问题集中在继承.派生.virtual函数等.如: virtual? non-virtual? pure ...

  6. Android启动外部应用的方法

    1.根据package的名称获取应用的Launch Intent Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage ...

  7. August 13th 2017 Week 33rd Sunday

    The best accessory a girl can own is confidence. 女生最好的饰品就是自信. Only when we have our own ideas and on ...

  8. July 29th 2017 Week 30th Saturday

    Where there is great love, there are always miracles. 哪里有真爱存在,哪里就有奇迹发生. Everyone expects there can b ...

  9. struts2面试整理

    struts2的工作原理 客户端发送请求 经过一系列的过滤器 FilterDispatcher通过ActionMapper来决定这个REquest需要调用的Action FilterDispather ...

  10. css3 圣诞红包雨效果

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...