博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洗礼灵魂,修炼python(34)--面向对象编程(4)—继承
阅读量:6643 次
发布时间:2019-06-25

本文共 3185 字,大约阅读时间需要 10 分钟。

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

继承

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('yang','男','21','黄皮肤','黑头发','中国话')

结果:

 

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

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

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

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

 

 

所以可以得出

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

 

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

方法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('yang','男','21','黄皮肤','黑头发','中国话','黑眼睛')

 

 

结果:

 

 

方法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函数,怎么写你就自己下去研究了,前面复杂的你都会了,相信这个稍微简单的你肯定会,留为课后作业自己练习下吧

 

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

 

转载于:https://www.cnblogs.com/yangva/p/7678191.html

你可能感兴趣的文章
POJ - 3164 Command Network(朱刘算法)
查看>>
phalcon:官方多模块支models层,mode数据库配置
查看>>
Java并发编程:Callable、Future和FutureTask
查看>>
【日常学习】【IDA*】codevs2449 骑士精神题解
查看>>
[C#]非阻塞监听键盘输入
查看>>
Ubuntu 16.04安装Git及GUI客户端
查看>>
Linux的终端类型
查看>>
IntelliJ Idea 快捷键
查看>>
BZOJ 1699 [Usaco2007 Jan]Balanced Lineup排队 线段树
查看>>
网络中常见的ping命令协议
查看>>
web.xml 配置中classpath: 与classpath*:的区别——(十一)
查看>>
Angular.js回想+学习笔记(1)【ng-app和ng-model】
查看>>
Netlink 内核实现分析(二):通信
查看>>
内建模块collections的使用
查看>>
[转]使用DW正则表达式批量替换实例介绍
查看>>
《图说VR入门》——DK2入门及其资源汇总
查看>>
Do You Kown Asp.Net Core -- Asp.Net Core 2.0 未来web开发新趋势 Razor Page
查看>>
模拟阻尼运动
查看>>
ASP.NET MVC框架开发系列教程
查看>>
ViewPager,实现真正的无限循环(定时+手动)
查看>>