7.2 继承与派生

7.21继承

1、什么是继承? 继承是一种新建类的的方式,在python中支持一个子类继承多个父类。新建的类称为子类或者派生类,父类又可以称为基类或者超类,子类会”遗传“父类的属性。


2、为什么要用继承 减少代码冗余

  1. class ParentClass1:
  2. pass
  3. class ParentClass2:
  4. pass
  5. class Subclass1(ParentClass1):
  6. pass
  7. class Subclass2(ParentClass1,ParentClass2):
  8. pass
  9. print(Subclass1.__bases__) #(<class '__main__.ParentClass1'>,)
  10. print(Subclass2.__bases__) #(<class '__main__.ParentClass1'>, <class '__main__.ParentClass2'>)

3、继承是类与类之间的关系,寻找这种关系需要先抽象再继承

  1. class OldboyPeople:
  2. school = 'oldboy'

  3. def __init__(self, name, age, sex):
  4. self.name = name
  5. self.age = age
  6. self.sex = sex

  7. class OldboyTeacher(OldboyPeople): #继承OldboyPeople类
  8. def change_score(self):
  9. print('teacher %s is changing score' %self.name)

  10. class Oldboystudent(OldboyPeople): #继承OldboyPeople类
  11. def choose(self):
  12. print('student %s choose course' %self.name)

  13. tea1 = OldboyTeacher('egon', 18, 'male') # 相当于OldboyTeacher.__init__(...)
  14. stu1=Oldboystudent('alex',73,'female')

  15. print(tea1.name,tea1.age,tea1.sex) #egon 18 male
  16. print(stu1.name,stu1.age,stu1.sex) #alex 73 female

7.22 派生

派生:子类定义自己新的属性,如果与父类同名,以子类自己的为准

  1. class OldboyPeople:
  2. school = 'oldboy'
  3. def __init__(self, name, age, sex):
  4. self.name = name
  5. self.age = age
  6. self.sex = sex
  7. def f1(self):
  8. print('爹的f1')
  9. class OldboyTeacher(OldboyPeople):
  10. def __init__(self,name,age,sex,level,salary):
  11. self.name=name
  12. self.age=age
  13. self.sex=sex
  14. self.level=level
  15. self.salary=salary
  16. def change_score(self):
  17. print('teacher %s is changing score' %self.name)
  18. def f1(self):
  19. print('儿子的f1')
  20. tea1 = OldboyTeacher('egon', 18, 'male',9,3.1) #传入6个参数,如果传入父类ze报错
  21. print(tea1.name,tea1.age,tea1.sex,tea1.level,tea1.salary) #egon 18 male 9 3.1

7.23 在子类派生出的新方法中重用父类的功能

方式一:指名道姓地调用(与继承没有什么关系

  1. class OldboyPeople:
  2. school = 'oldboy'
  3. def __init__(self, name, age, sex):
  4. self.name = name
  5. self.age = age
  6. self.sex = sex
  7.  
  8. class OldboyTeacher(OldboyPeople): #可有可无
  9. def __init__(self, name, age, sex, level, salary):
  10. # self.name = name
  11. # self.age = age
  12. # self.sex = sex
  13. OldboyPeople.__init__(self,name, age, sex)#用 OldboyPeople调用__init__的方式重用父类功能
  14. self.level = level
  15. self.salary = salary

  16. tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
  17. print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) #egon 18 male 9 3.1

方式二:super()调用(严格依赖于继承

super ( ) 的返回值是一个特殊的对象,该对象专门用来调用父类中的属性,super()会严格按照mro列表从当前查找到的位置继续往后查找

了解:在python2中,需要super(自己的类名,self)

  1. class OldboyPeople:
  2. school = 'oldboy'
  3. def __init__(self, name, age, sex):
  4. self.name = name
  5. self.age = age
  6. self.sex = sex

  7. class OldboyTeacher(OldboyPeople): #必须有父类
  8. def __init__(self, name, age, sex, level, salary):
  9. super(OldboyTeacher,self).__init__(name,age,sex)# OldboyPeople.__init__(self,name, age,sex)
  10. self.level = level
  11. self.salary = salary

  12. tea1 = OldboyTeacher('egon', 18, 'male', 9, 3.1)
  13. print(tea1.name, tea1.age, tea1.sex, tea1.level, tea1.salary) #egon 18 male 9 3.1

7.3 经典类与新式类

1、新式类: 继承object的类,以及该类的子类,都是新式类

在python3中,如果一个类没有指定继承的父类,默认就继承object,所以说python3中所有的类都是新式类

2、经典类(只有在python2才区分经典类与新式类):没有继承object的类,以及该类的子类,都是经典类

  1. class Foo(): #在python3中
  2. pass

  3. class Bar(Foo):
  4. pass

  5. print(Foo.__bases__) #(<class 'object'>,)
  6. print(Bar.__bases__) #(<class '__main__.Foo'>,)

7.34 在多继承背景下的属性查找

  1. 属性查找
  1. obj.x
  2. 1、先从obj.__dict__
  3. 2、对象的类.__dict__
  4. 3、父类.__dict__
  5. ..........

如果继承关系为非菱形结构,则会按照先找B这一条分支,然后再找C这一条分支,最后找D这一条分支的顺序直到找到我们想要的属性

如果继承关系为菱形结构,那么属性的查找方式有两种,分别是:深度优先和广度优先

  1. print(F.__mro__) # F.mro() #只有新式类才有这个属性可以查看线性列表,查看属性查找顺序,经典类没有这个属性

python 之 面向对象基础(继承与派生,经典类与新式类)的更多相关文章

  1. Python面向对象编程——继承与派生

    Python面向对象编程--继承与派生 一.初始继承 1.什么是继承 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题. 继承是一种创 ...

  2. python 面向对象之继承与派生

    一:初识继承 1,什么是继承? 继承指的是类与类之间的关系,是一种什么"是"什么的关系,继承的功能之一就是用来解决代码重用问题 继承是一种创建新类的方式,在python中,新建的类 ...

  3. python基础——继承与派生、组合

    python基础--继承与派生 1 什么是继承: 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类成为基类或超累,新建的类成为派生类或子类 1.1 继承分为:单 ...

  4. python之旅:面向对象之继承与派生

    一 初识继承 编写类时,并非总要从空白开始.如果你要编写的类正好是另一个现成类的特殊版本,可使用继承来减少代码冗余,子类会“遗传”父类的属性,从而解决代码重用问题 什么是继承 继承是一种创建新类的方式 ...

  5. python开发面向对象基础:组合&继承

    一,组合 组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合      人类装备了武器类就是组合 1.圆环,将圆类实例后传给圆环类 #!/usr/bin/env python #_*_ ...

  6. python面向对象之继承与派生

    一.继承 继承是一种创建新的类的方式,在python中,新建的类可以继承自一个或者多个父类,原始类称为基类或超类,新建的类称为派生类或子类. python中类的继承分为:单继承和多继承,如果是多继承的 ...

  7. python之面向对象(继承)

    类的继承 python之面向对象(继承) 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制.继承完全可以理解成类之间的类型和子类型关系. 需要注意的地方:继承语法 c ...

  8. 二十三. Python基础(23)--经典类和新式类

    二十三. Python基础(23)--经典类和新式类 ●知识框架   ●接口类&抽象类的实现 # 接口类&抽象类的实现 #①抛出异常法 class Parent(object):    ...

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

    继承知识点补充 在python还支持多继承,但是一般我们很少用,有些语言干脆就不支持多继承,有多继承,就会带来两个概念,经典类和新式类. 一.多继承 之前我们都是讲的单继承,那么什么是多继承呢?说白了 ...

随机推荐

  1. Ibatis自动解决sql注入机制

    疑问1:为什么IBatis解决了大部分的sql注入?(实际上还有部分sql语句需要关心sql注入,比如like) 之前写Java web,一直使用IBatis,从来没有考虑过sql注入:最近写php( ...

  2. SQLEXPR_x64_CHS、SQLEXPRADV_x64_CHS、SQLEXPRWT_x64_CHS、SqlLocalDB、SQLManagementStudio_x64_CHS各版本说明

    LocalDB (SqlLocalDB)LocalDB 是 Express的一种轻型版本,该版本具备所有可编程性功能,但在用户模式下运行,并且具有快速的零配置安装和必备组件要求较少的特点.如果您需要通 ...

  3. BDD本质及与ATDD区别

    说起BDD,你会想到什么?   在刚接触BDD(Behavior Driven Development,行为驱动开发)的时候,我以为就是用Cucumber这样的工具来编写场景用例,从而实现自动化测试, ...

  4. mosquitto设置用户名和密码

    https://blog.csdn.net/qq_22111417/article/details/84142509 7.设置用户名和密码 找到用户密码文件在安装bin下: 1: 打开mosquitt ...

  5. centos sqlite3安装及简单命令

    安装:方法一:wget http://www.sqlite.org/sqlite-autoconf-3070500.tar.gztar xvzf sqlite-autoconf-3070500.tar ...

  6. SpringMVC:HandlerInterceptor log 日志

    springMVC:HandlerInterceptor拦截器添加系统日志(权限校验)代码收藏 - LinkcOne - CSDN博客https://blog.csdn.net/qq_22815337 ...

  7. go cmd nohup 的坑

    https://github.com/go-cmd/cmd/issues/20 golang 的 cmd 包在执行系统命令时,如果使用的到了 nohup 命令, 那么就需要注意, 需要在 nohup ...

  8. typescript装饰器定义 类装饰器 属性装饰器 装饰器工厂

    /* 装饰器:装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为. 通俗的讲装饰器就是一个方法,可以注入到类.方法.属性参数上来扩展类.属性.方法.参数的功能. 常 ...

  9. 编写第一个dart程序hello dart

    /* 入口方法的两种定义方式 main(){ print('hello dart'); } */ ///这也是一个注释 //表示main方法没有返回值 void main(){ print('hell ...

  10. python-learning-第二季-画图matplotlib

    https://www.bjsxt.com/down/8468.html 绘制方法: 绘制直线: #coding:utf- import matplotlib.pyplot as plt #准备绘制的 ...