前面已经说到面向对象编程有封装,继承,多态三大特性,那么其中的继承则很重要,可以直接单独的拿出来解析

继承

1.什么是继承:

字面意是子女继承父母的家产或者特性等。而在编程里继承是指子类继承父类(基类,超类,都一个意思)的属性和方法

2.怎么继承:

说个简单的例子,在前面里说到了定义类时使用object参数后就带有了object的属性和方法,这种自然带有的属性和方法就是继承。

所以,继承的方法:在事先有父类的前提下,定义子类时,把父类类对象以参数形式传入就行

例子:

3.实际案列:

定义一个继承人类为基类的子类的中国人:(注意看代码,因为本篇博文大部分知识点都是由这个例子展开)

class Human:
    def __init__(self,name,sex,age,skin_color,hair_color,language):
        self.head=1
        self.hands=2
        self.legs=2
        self.name=name
        self.sex=sex
        self.age=age
        self.skin_color=skin_color
        self.hair_color=hair_color
        self.language=language
    def walk(self):
        print ('白天出去逛街')
    def sleep(self):
        print('晚上回家睡觉')

class chinaman(Human):
    def old_Invention(self):
        print('中国人发明了火药,造纸术,指南针,印刷术')
    def new_Invention(self):
        print('中国人发明了高铁,支付宝,共享单车,网购')

yang=chinaman(','黄皮肤','黑头发','中国话')

结果:

这个例子就很好的体现了继承,中国人继承了人类,中国人不仅继承了人类的属性和方法,还有自己独有的方法

不过,细心的朋友应该发现了,我在定义子类时并没有使用构造器初始化,那么我初始化看看呢?

代码其他不变,在子类加入构造器初始化:

发现了没?好像在子类继承父类后再初始化实例属性时把父类的初始化下的实例属性全部覆盖掉了。所以你终于知道我刚才为什么不初始化了吧?那么父类是不是也被改变了呢?实例化一个父类对象看看:

所以可以得出

  • 当子类添加属性后,调用子类时,继承父类,但有自己的属性或方法
  • 当子类重写的属性和父类相同,子类覆盖父类属性为子类的新属性,但父类不受影响

不过这个问题还是得解决啊,因为在实际的开发中,总会在继承父类后又初始化新的属性的,比如我在原来的父类基础上想加入头发颜色参数,有没有办法解决呢?答案是肯定有的,而且有两个办法:

方法1:调用未绑定的父类方法:父类名.__init__(self)

给子类在父类基础上加头发颜色参数:

发现报错了,提示需要给name等父类参数赋值定义:

一起加入又提示参数给多了,分开加入,子类在前,把父类参数作为一个元组(这样就是两个参数了)加入提示还是给多了参数。

所以这里体现出一个问题,在子类继承父类时,父类的参数在子类实例化时必须全部赋值定义,如果有子类参数也一并赋值定义

大概看懂了吧?

那么我们要在子类添加头发颜色的话,正确的方法是这样:

class Human:
    def __init__(self,name,sex,age,skin_color,hair_color,language): #父类的参数
        #为父类参数赋值定义
        self.head=1
        self.hands=2
        self.legs=2
        self.name=name
        self.sex=sex
        self.age=age
        self.skin_color=skin_color
        self.language=language
        self.hair_color=hair_color

    def walk(self):
        print ('白天出去逛街')
    def sleep(self):
        print('晚上回家睡觉')

class chinaman(Human):
    def __init__(self,name,sex,age,skin_color,hair_color,language,eye_color): #子类和父类全部参数赋值定义
        Human.__init__(self,name,sex,age,skin_color,hair_color,language)  #表示继承父类的参数

        self.eye_color=eye_color #不继承父类的参数,即子类参数
    def old_Invention(self):
        print('中国人发明了火药,造纸术,指南针,印刷术')
    def new_Invention(self):
        print('中国人发明了高铁,支付宝,共享单车,网购')

yang=chinaman(','黄皮肤','黑头发','中国话','黑眼睛')  

结果:

方法2:使用super高阶函数:super([子类名,self]).__self(父类对象参数)

super函数和方法一的功效是一样的,只不过写法有一点点不同而已

注意使用super函数时,不用传进self(不然报错),也不用写入父类名,会自动查找

也可以这样写:

所以,是一样的。

但是两种写法都不能加self,这点很重要,必须记住

是不是我给的参数太多没看懂是吧?

看个简单点的:

class A(object):
    def __init__(self, name,test):
        self.name=name
        self.test=test
        print ("name:", self.name)
        print ('test:',self.test)
    def getName(self):
        return 'A ' + self.name

class B(A):
    def __init__(self, name,test,age): #这里写下父类子类所有的参数
        A.__init__(self,name,test)  #把父类的参数单独拿出来表示
        print ("hi")
        self.name = name  #父类参数赋值定义
        self.test=test  #父类参数赋值定义
        self.age=age  #子类参数赋值定义
    def getName(self):
        return 'B '+self.name

if __name__=='__main__':
    b=B('hello','test','age')
    print (b.getName())

结果:

然后这个例子里如果使用super函数,怎么写你就自己下去研究了,前面复杂的你都会了,相信这个稍微简单的你肯定会,留为课后作业自己练习下吧

好的,关于继承,具体的还是要你自己下去琢磨或者研究

洗礼灵魂,修炼python(34)--面向对象编程(4)—继承的更多相关文章

  1. Python(面向对象编程——2 继承、派生、组合、抽象类)

    继承与派生 ''' 继承:属于 组合:包含 一. 在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称 ...

  2. python基础——面向对象编程

    python基础——面向对象编程 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的 ...

  3. Python之面向对象编程学习

    不知不觉,学到了python的面向对象编程思想.今天我们来讨论下面向对象编程的思想. 顾名思义,面向对象,就是面向于对象,这里所说的对象不是你现实生活中你的女朋友,你的老婆,你的爱人,在编程的世界里面 ...

  4. Python:面向对象编程3 定制类(有更新)

    Python:面向对象编程3  定制类(有更新) ⚠️本文主要内容为对Data model相关知识点的提取学习记录.(内容来自文档和部分网页教程案例) ⚠️:这个连接指向<流畅的python&g ...

  5. python基础-面向对象编程

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程 2.函数式编程 3.面向对象编程 二.编程进化论 1.编程最开始就是无组织无结构,从简单控制流中按步写指令 ...

  6. python之面向对象编程

    1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...

  7. Python(面向对象编程—1)

    class tst: l=[] x=1 a=tst() b=tst() a.l.append('a') b.l.append('b') a.x='a' b.x='b' print(a.l,a.x) # ...

  8. python的面向对象编程

    面向对象编程是一种程序的范式,它把程序看成是对不同对象的相互调用,对现实世界建立的一种模型. 面向对象编程的基本思想,类和实例.类用于定义抽象对象,实例根据类的定义被创建出来. 在python当中我们 ...

  9. 一文看懂Python的面向对象编程

    之前在网络上看了很多关于面向对象的编程详解,还是不够过瘾,所以决定自己动手写一篇. 面向对象:Object Oriented Programming,简称OOP,即面向对象程序设计. 类(Class) ...

  10. python学习——面向对象编程

    关于python面向对象编程,请参考: https://blog.csdn.net/zhoudaxia/article/details/23341261

随机推荐

  1. 自动化测试框架的Step By Step搭建及测试实战(1)

    1.1什么是自动化测试框架 1.什么是自动化框架 自动化框架是应用与自动化测试的程序框架,它提供了可重用的自动化测试模块,提供最基础的自动化测试功能,或提供自动化测试执行和管理功能的架构模块.它是由一 ...

  2. RabbitMQ常见错误2

    java.io.IOException at com.rabbitmq.client.impl.AMQChannel.wrap(AMQChannel.java:105) at com.rabbitmq ...

  3. Ubuntu18.04 下修改 root密码

    首先打开终端输入命令 sudo passwd root 然后依次是当前用户密码,将要设置root密码,确认root密码.切换root看一下 备注: #符号 是系统用户 root$符号 是你创建的用户 ...

  4. Python:渗透测试开源项目【源码值得精读】

    sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XSS漏洞利用工具:XSSer Web服务器压力测试工具:HULK SSL安全扫描器:SSLyze 网 ...

  5. Django--Auth 模块

    1 Auth模块是什么 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码 ...

  6. maven-assembly-plugin的使用

    maven-assembly-plugin使用描述(拷自 maven-assembly-plugin 主页) The Assembly Plugin for Maven is primarily in ...

  7. FFmpeg封装格式处理4-转封装例程

    本文为作者原创,转载请注明出处:https://www.cnblogs.com/leisure_chn/p/10506662.html FFmpeg封装格式处理相关内容分为如下几篇文章: [1]. F ...

  8. 【F12】chrome浏览器中 F12 功能的简单介绍

    chrome浏览器中 F12 功能的简单介绍 由于F12是前端开发人员的利器,所以我自己也在不断摸索中,查看一些博客和资料后,自己总结了一下来帮助自己理解和记忆,也希望能帮到有需要的小伙伴,嘿嘿! 首 ...

  9. SVN外网访问内网的操作步骤

    外网访问内网SVN 需要将路由映射到VisualSVN server 的443端口 将外网的端口从路由器上进行映射到内网端口,例如将外网的6000端口映射为内网的443端口,443为svn服务器默认端 ...

  10. VS2017进程为idXXXX 无法启动解决方案

    1.对无法启动项目的 .csproj 后缀文件用记事本打开 找到<WebProjectProperties>xx</WebProjectProperties> 删掉 让后 重新 ...